debug-js / debug

A tiny JavaScript debugging utility modelled after Node.js core's debugging technique. Works in Node.js and web browsers
MIT License
11.13k stars 935 forks source link

Does 'debug' cache the DEBUG environment variable somewhere? Getting no output after changing namespace and DEBUG env var. #901

Open KerimG opened 2 years ago

KerimG commented 2 years ago

I am using 'debug' with TypeScript in an Electron project like so:

import debug from 'debug';
const log = debug('foo');

export default async function myFunction(name: string) {
  log('calling myFunction');
  ...
  log('successfully returning myFunction');
  return someVariable;
}

in my shell (zsh) I set the DEBUG env var like so export DEBUG=foo and then started running my application. Everything worked fine. Eventually, I changed the namespace from foo to bar and now no matter what I do, I cannot get any output. I tried resetting DEBUG, I restarted my shell and set the environment variable again with export DEBUG=bar, I tried using the [cross-env]{https://www.npmjs.com/package/cross-env} to set it like so:

"scripts": {
    "start": "tsc && cross-env DEBUG=bar NODE_ENV=development electron-forge start",
    ...
}

but nothing ever shows up. I tried

import debug from 'debug';
const log = debug('bar');

console.log("DEBUG", process.env.DEBUG);

export default async function myFunction(name: string) {
  log('calling myFunction');
  ...
  log('successfully returning myFunction');
  return someVariable;
}

and the console.log output is indeed: DEBUG bar.

The only way I can get it to work now is by doing:

import debug from 'debug';
const log = debug('bar');
log.enabled = true;

The moment I change const log = debug('bar'); back to const log = debug('foo'); , I get output messages for the foo namespace no matter what's in the DEBUG env var.

Any idea what might be happening here?

robigan commented 2 years ago

Having a similar issue here, but just to help you, maybe try running export on it's own to print a debug output of all environment variables that will be exported to children processes

Qix- commented 2 years ago

No idea, this seems like an environment issue to be honest. DEBUG is checked once at the first import of debug and cached.

algernon commented 2 years ago

I've been bitten by this the other day too. Turns out, DEBUG is cached in LocalStorage, and in subsequent runs, LocalStorage will override the environment. You can do localStorage.debug = null in a dev console to reset it.

Qix- commented 2 years ago

@algernon that's a detail of the browser version. I believe OP is using the node side of things.

abenhamdine commented 2 years ago

Same issue with Remix today, process.env shows the correct expected DEBUG string, but debugnever outputs anything. Very weird.

GodBleak commented 2 years ago

Are/were you using regex in your code somewhere? possibly passing it into debug? I think this issue was introduced with toNamespace() in 4.1.0

When I had DEBUG = *, I saw express was able to debug fine. I noticed that they're using debug 2.6.9, so I went through the versions and found that debug works as expected until 4.1.0. Seeing that toNamespace converts regex into a namespace and realizing I was potentially passing regex into debug, I remembered Javascript's regex is weird. commenting out my regex returned the output in 4.3.4.

However, at that point, the universe decided I was done, as uncommenting it did not reintroduce the issue and no matter what I do now I can't reproduce it again, I've rolled everything back to exactly as it was when I had the problem and it's just gone 🤷