debug is a free, open source monitoring & observability project written in JavaScript and released under MIT. It has 11,454 GitHub stars, 991 forks and 96 open issues, and was last pushed 6 months ago. On this registry it ranks #38 of 97 tracked projects in Monitoring & Observability, with 5 head-to-head comparisons available.

What is debug?

debug is a tiny, MIT-licensed JavaScript debugging utility modelled after Node.js core's debugging technique, and it is aimed at JavaScript developers and library authors who want to turn debug output on and off by namespace instead of editing or deleting logging statements.

What it is

debug lives in the JavaScript and Node.js ecosystem and is distributed through npm as the debug package. It exposes a single function: pass that function the name of a module, and it returns a decorated version of console.error for debug statements to be written to. Each returned function carries a namespace, so an application can hold one debug instance per module or per subsystem and switch each one on independently. The set of enabled namespaces is read from the DEBUG environment variable, using space- or comma-delimited names, which means output selection happens at run time rather than in the source. The same module runs in Node.js and in web browsers, so one mechanism covers both halves of a codebase.

The concrete problem it solves is the fate of the ad-hoc console.log statement. Logging added while chasing a bug normally has to be commented out, deleted or wrapped in custom flag checks before release, and the next debugging session repeats the whole cycle. debug replaces that practice with a persistent, namespaced call site that stays in the code and is enabled from the outside. It is modelled after Node.js core's debugging technique, which is why the enablement mechanism is an environment variable rather than an API call. Namespace colors and millisecond timing diffs are folded into the same output, so a developer reading a busy terminal can tell which instance produced a line and how long elapsed between two calls.

Key capabilities

  • Namespaced debuggers: requiring debug with a namespace name such as http or worker:a yields a logger that is toggled by that namespace.
  • The DEBUG environment variable accepts space- or comma-delimited names, wildcards such as DEBUG=connect:* or DEBUG=, and exclusions written with a leading minus, as in DEBUG=,-not_this.
  • Automatic per-namespace colors; in Node.js colors are enabled when stderr is a TTY, and the supports-color module is recommended alongside debug for a fuller palette, while browser colors rely on inspectors that understand the %c formatting option.
  • Millisecond diff output in the form "+NNNms" between consecutive debug calls, with Date#toISOString() used instead when stdout is not a TTY, which suits writing debug information to a log.
  • Format specifiers including %o, as in debug('booting %o', name), for object substitution into the debug line.
  • A trailing * appended to a namespace name makes that debugger always enabled regardless of the DEBUG setting, so it can carry normal output as well as debug output.
  • Documented platform syntax for setting the variable, using set DEBUG=,-not_this in Windows CMD and $env:DEBUG = ",-not_this" in PowerShell.

Who uses it and how

  • Library authors who namespace their debuggers under their own library name so that consumers can toggle them without guessing; the documented convention prefixes features with the library name and separates them with a colon, as in connect:bodyParser.
  • Applications with several subsystems, as in the README example that runs a worker:a debugger and a worker:b debugger independently alongside the application's own http namespace.
  • Front-end developers debugging in a browser, where colors appear in WebKit web inspectors, in Firefox since version 31, and in the Firebug plugin for Firefox.
  • Windows developers wiring it into npm scripts, for example "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js".
  • Anyone who wants an entire module tree's output at once, which the wildcard DEBUG=* provides instead of listing every debugger name individually.

Getting started

Install it with npm install debug, then call require('debug') with a namespace name to obtain a logger. Output is switched on by setting the DEBUG environment variable to the relevant names before starting the program.

How it compares

The supplied facts name no paid products that this project is meant to replace and no alternative debug-toggling library that it competes with, so on the evidence available it stands alone in this registry. The only related module the facts mention is supports-color, which is an optional companion installed alongside debug rather than a substitute for it.

When to use it — and when not to

Because it is an npm dependency rather than a service, a self-hoster operates no database, object storage or mail server to use it, and setup amounts to installing the package and choosing namespace names. Teams that need durable, aggregated or structured logs should not pick it, since its output is a decorated console.error bound to the running process and nothing in the facts indicates persistence or shipping to a log backend. The honest caveats are documentation and scope: the README excerpt available here is truncated mid-sentence in the Wildcards section, and the topic list is limited to browser, debug, debugging, javascript, logging, node and node-js.

project readme (upstream, from github) — read inline

debug

OpenCollective OpenCollective

A tiny JavaScript debugging utility modelled after Node.js core's debugging technique. Works in Node.js and web browsers.

Installation

$ npm install debug

Usage

debug exposes a function; simply pass this function the name of your module, and it will return a decorated version of console.error for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.

Example app.js:

var debug = require('debug')('http')
  , http = require('http')
  , name = 'My App';

// fake app

debug('booting %o', name);

http.createServer(function(req, res){
  debug(req.method + ' ' + req.url);
  res.end('hello\n');
}).listen(3000, function(){
  debug('listening');
});

// fake worker of some kind

require('./worker');

Example worker.js:

var a = require('debug')('worker:a')
  , b = require('debug')('worker:b');

function work() {
  a('doing lots of uninteresting work');
  setTimeout(work, Math.random() * 1000);
}

work();

function workb() {
  b('doing some work');
  setTimeout(workb, Math.random() * 2000);
}

workb();

The DEBUG environment variable is then used to enable these based on space or comma-delimited names.

Here are some examples:

screen shot 2017-08-08 at 12 53 04 pm screen shot 2017-08-08 at 12 53 38 pm screen shot 2017-08-08 at 12 53 25 pm
Windows command prompt notes
CMD

On Windows the environment variable is set using the set command.

set DEBUG=*,-not_this

Example:

set DEBUG=* & node app.js
PowerShell (VS Code default)

PowerShell uses different syntax to set environment variables.

$env:DEBUG = "*,-not_this"

Example:

$env:DEBUG='app';node app.js

Then, run the program to be debugged as usual.

npm script example:

  "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js",

Namespace Colors

Every debug instance has a color generated for it based on its namespace name. This helps when visually parsing the debug output to identify which debug instance a debug line belongs to.

Node.js

In Node.js, colors are enabled when stderr is a TTY. You also should install the supports-color module alongside debug, otherwise debug will only use a small handful of basic colors.

Web Browser

Colors are also enabled on "Web Inspectors" that understand the %c formatting option. These are WebKit web inspectors, Firefox (since version 31) and the Firebug plugin for Firefox (any version).

Millisecond diff

When actively developing an application it can be useful to see when the time spent between one debug() call and the next. Suppose for example you invoke debug() before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.

When stdout is not a TTY, Date#toISOString() is used, making it more useful for logging the debug information as shown below:

Conventions

If you're using this in one or more of your libraries, you should use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you should prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output.

Wildcards

The * character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with DEBUG=connect:bodyParser,connect:compress,connect:session, you may simply do DEBUG=connect:*, or to run everything using this module simply use DEBUG=*.

You can also exclude specific debuggers by prefixing them with a "-" character. For example, DEBUG=*,-connect:* would include all debuggers except those starting with "connect:".

Environment Variables

When running through Node.js, you can set a few environment variables that will change the behavior of the debug logging:

Name Purpose
DEBUG Enables/disables specific debugging namespaces.
DEBUG_HIDE_DATE Hide date from debug output (non-TTY).
DEBUG_COLORS Whether or not to use colors in the debug output.
DEBUG_DEPTH Object inspection depth.
DEBUG_SHOW_HIDDEN Shows hidden properties on inspected objects.

Note: The environment variables beginning with DEBUG_ end up being converted into an Options object that gets used with %o/%O formatters. See the Node.js documentation for util.inspect() for the complete list.

Formatters

Debug uses printf-style formatting. Below are the officially supported formatters:

Formatter Representation
%O Pretty-print an Object on multiple lines.
%o Pretty-print an Object all on a single line.
%s String.
%d Number (both integer and float).
%j JSON. Replaced with the string '[Circular]' if the argument contains circular references.
%% Single percent sign ('%'). This does not consume an argument.

Custom formatters

You can add custom formatters by extending the debug.formatters object. For example, if you wanted to add support for rendering a Buffer as hex with %h, you could do something like:

const createDebug = require('debug')
createDebug.formatters.h = (v) => {
  return v.toString('hex')
}

// …elsewhere
const debug = createDebug('foo')
debug('this is hex: %h', new Buffer('hello world'))
//   foo this is hex: 68656c6c6f20776f726c6421 +0ms

Browser Support

You can build a browser-ready script using browserify, or just use the browserify-as-a-service build, if you don't want to build it yourself.

Debug's enable state is currently persisted by localStorage. Consider the situation shown below where you have worker:a and worker:b, and wish to debug both. You can enable this using localStorage.debug:

localStorage.debug = 'worker:*'

And then refresh the page.

a = debug('worker:a');
b = debug('worker:b');

setInterval(function(){
  a('doing some work');
}, 1000);

setInterval(function(){
  b('doing some work');
}, 1200);

In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by debug if the "Verbose" log level is enabled.

Output streams

By default debug will log to stderr, however this can be configured per-namespace by overriding the log method:

Example stdout.js:

var debug = require('debug');
var error = debug('app:error');

// by default stderr is used
error('goes to stderr!');

var log = debug('app:log');
// set this namespace to log via console.log
log.log = console.log.bind(console); // don't forget to bind to console!
log('goes to stdout');
error('still goes to stderr!');

// set all output to go via c

readme truncated — read the full docs on github

Frequently asked questions

Is debug free to use?

debug is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does debug do?

A tiny JavaScript debugging utility modelled after Node.js core's debugging technique. Works in Node.js and web browsers

What is debug written in?

debug is primarily written in JavaScript. Its source is publicly available at https://github.com/debug-js/debug, and it has 11,454 GitHub stars.