debug
A tiny JavaScript debugging utility modelled after Node.js core's debugging technique. Works in Node.js and web browsers.
Installation
1$ 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18var 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var 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:
Windows note
On Windows the environment variable is set using the set
command.
1set DEBUG=*,-not_this
Note that PowerShell uses different syntax to set environment variables.
1$env:DEBUG = "*,-not_this"
Then, run the program to be debugged as usual.
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
アプリケーションを積極的に開発する場合、あるdebug()
呼び出しと次の呼び出しの間に費やされた時間を確認すると便利です。たとえばdebug()
、リソースを要求する前に呼び出し、その後も「+ NNNms」が費やされた時間を表示するとします。呼び出しの合間に。
stdoutがTTYでない場合は、Date#toISOString()
が使用され、以下に示すようにデバッグ情報をログに記録するのに役立ちます。
コンベンション
1つ以上のライブラリでこれを使用している場合は、開発者が名前を推測せずに必要に応じてデバッグを切り替えることができるように、ライブラリの名前を使用する必要があります。複数のデバッガーがある場合は、ライブラリ名と機能を区切るには「:」を使用します。たとえば、Connectの「bodyParser」は「connect:bodyParser」になります。名前の末尾に「*」を追加すると、DEBUGの設定に関係なく常に有効になります。環境変数。これを通常の出力とデバッグ出力に使用できます。
ワイルドカード
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 |
対象物の検査深度。 |
DEBUG_SHOW_HIDDEN |
検査されたオブジェクトの非表示のプロパティを表示します。 |
注:最初の環境変数DEBUG_
は、%o
/%O
フォーマッターで使用されるOptionsオブジェクトに変換されutil.inspect()
ます。完全なリストについては、Node.jsのドキュメントを参照してください
。
フォーマッター
デバッグではprintfスタイルのフォーマットを使用します。公式にサポートされているフォーマッターは次のとおりです。
フォーマッター | 表現 |
---|---|
%O |
オブジェクトを複数行にきれいに印刷します。 |
%o |
オブジェクトをすべて1行にきれいに印刷します。 |
%s |
弦。 |
%d |
数値(整数と浮動小数点の両方)。 |
%j |
JSON。引数に循環参照が含まれている場合は、文字列「[Circular]」に置き換えられます。 |
%% |
単一パーセント記号( '%')。これは引数を消費しません。 |
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:
1
2
3
4
5
6
7
8
9const 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
:
1localStorage.debug = 'worker:*'
And then refresh the page.
1
2
3
4
5
6
7
8
9
10a = debug('worker:a');
b = debug('worker:b');
setInterval(function(){
a('doing some work');
}, 1000);
setInterval(function(){
b('doing some work');
}, 1200);
Output streams
By default debug
will log to stderr, however this can be configured per-namespace by overriding the log
method:
Example stdout.js:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17var 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 console.info
// overrides all per-namespace log settings
debug.log = console.info.bind(console);
error('now goes to stdout via console.info');
log('still goes to stdout, but via console.info now');
Set dynamically
You can also enable debug dynamically by calling the enable()
method :
1
2
3
4
5
6
7
8
9
10let debug = require('debug');
console.log(1, debug.enabled('test'));
debug.enable('test');
console.log(2, debug.enabled('test'));
debug.disable();
console.log(3, debug.enabled('test'));
print :
1
2
31 false
2 true
3 false
Usage :enable(namespaces)
namespaces
can include modes separated by a colon and wildcards.
Note that calling enable()
completely overrides previously set DEBUG variable :
1
2$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))'
=> false
Checking whether a debug target is enabled
After you've created a debug instance, you can determine whether or not it is
enabled by checking the enabled
property:
1
2
3
4
5const debug = require('debug')('http');
if (debug.enabled) {
// do stuff...
}
You can also manually toggle this property to force the debug instance to be enabled or disabled.
Authors
- TJ Holowaychuk
- Nathan Rajlich
- Andrew Rhyne
Backers
Support us with a monthly donation and help us continue our activities. [Become a backer]
Sponsors
Become a sponsor and get your logo on our README on Github with a link to your site. [Become a sponsor]
License
(The MIT License)
Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
本ソフトウェアは「現状有姿」で提供され、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示または黙示を問わず、いかなる種類の保証もありません。いかなる場合も、作成者または著作権を保持するものではありません。契約、不法行為、またはその他の行為にかかわらず、本ソフトウェアまたは本ソフトウェアの使用またはその他の取引に起因する、または関連する損害またはその他の責任。