素晴らしいコミュニティモジュール

デバッグ

ビルドステータスカバレッジステータススラックOpenCollectiveOpenCollective

Node.jsコアのデバッグ手法をモデルにした小さなJavaScriptデバッグユーティリティ。Node.jsおよびWebブラウザで動作します。

インストール

1
$ npm install debug

使用法

debugは関数を公開します。この関数にモジュールの名前を渡すだけで、debugステートメントを渡すためのconsole.error装飾バージョンが返されます。これにより、モジュールのさまざまな部分のデバッグ出力を次のように切り替えることができます。モジュール全体と同様に。

app.jsの例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
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');

worker.js

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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();

次に、 DEBUG環境変数を使用して、スペースまたはコンマ区切りの名前に基づいてこれらを有効にします。

ここではいくつかの例を示します。

スクリーンショット2017-08-08at 12 53 04 pmスクリーンショット2017-08-08at 12 53 38 pmスクリーンショット2017-08-08at 12 53 25 pm

Windowsノート

Windowsでは、環境変数はsetコマンドを使用してsetます。

1
set DEBUG=*,-not_this

PowerShellは異なる構文を使用して環境変数を設定することに注意してください。

1
$env:DEBUG = "*,-not_this"

次に、通常どおりデバッグ対象のプログラムを実行します。

名前空間の色

すべてのデバッグインスタンスには、名前名に基づいて生成された色があります。これは、デバッグ出力を視覚的に解析して、デバッグ行が属するデバッグインスタンスを識別するときに役立ちます。

Node.js

Node.jsでは、stderrがTTYの場合、色が有効になります。また、debugと一緒にsupports-colorモジュールをインストールする必要があります。そうしないと、debugは少数の基本色のみを使用します。

ウェブブラウザ

色は、 %cフォーマットオプションを理解する「Webインスペクター」でも有効になっています。これらは、WebKit Webインスペクター、Firefox(バージョン31以降)、およびFirefox用のFirebugプラグイン(任意のバージョン)です。

ミリ秒差

アプリケーションを積極的に開発する場合、1つのdebug()呼び出しと次の呼び出しの間に費やされた時間を確認すると便利です。たとえば、リソースを要求する前にdebug()を呼び出し、その後も「+ NNNms」が表示されるとします。呼び出しの間にどれだけの時間が費やされたか。

stdoutがTTYでない場合は、 Date#toISOString()が使用されるため、以下に示すように、デバッグ情報をログに記録するのに役立ちます。

コンベンション

あなたのライブラリの1以上でこれを使用している場合、開発者は、必要に応じて名前を推測せずにデバッグを切り替えることができるように、あなたはあなたのライブラリーの名前を使用する必要があります。あなたは、複数のデバッガを使用している場合、あなたのライブラリーの名前でそれらを接頭辞すべきであり、機能を区切るには「:」を使用します。たとえば、Connectの「bodyParser」は「connect:bodyParser」になります。名前の末尾に「*」を追加すると、DEBUGの設定に関係なく常に有効になります。環境変数。これを通常の出力とデバッグ出力に使用できます。

ワイルドカード

*文字は、ワイルドカードとして使用できます。たとえば、ライブラリに、 DEBUG=connect:bodyParser,connect:compress,connect:session 3つすべてを一覧表示する代わりに、「connect:bodyParser」、「connect:compress」、「connect:session」という名前のデバッガーがあるとしますDEBUG=connect:bodyParser,connect:compress,connect:session 、単純にDEBUG=connect:*を実行するか、このモジュールを使用してすべてを実行するには、単純にDEBUG=*使用します。

特定のデバッガーの前に「-」文字を付けることで除外することもできます。たとえば、 DEBUG=*,-connect:*は、「connect:」で始まるものを除くすべてのデバッガーが含まれます。

環境変数

Node.jsを実行する場合、デバッグログの動作を変更するいくつかの環境変数を設定できます。

名前目的
DEBUG特定のデバッグ名前名を有効/無効にします。
DEBUG_HIDE_DATEデバッグ出力から日付を非表示にします(非TTY)。
DEBUG_COLORSデバッグ出力で色を使用するかどうか。
DEBUG_DEPTH対象物の検査深度。
DEBUG_SHOW_HIDDEN検査済みオブジェクトの非表示プロパティを表示します。

注: DEBUG_始まる環境変数は、 DEBUG_的に%o / %Oフォーマッターで使用されるOptionsオブジェクトに変換されます。完全なリストについては、 util.inspect() Node.jsドキュメントを参照してください。

フォーマッター

デバッグではprintfスタイルのフォーマットを使用します。公式にサポートされているフォーマッターは次のとおりです。

フォーマッター表現
%Oオブジェクトを複数行にきれいに印刷します。
%oオブジェクトをすべて1行にきれいに印刷します。
%sストリング。
%d数値(整数と浮動小数点の両方)。
%j JSON。引数に循環参照が含まれている場合は、文字列「[Circular]」に置き換えられます。
%%単一のパーセント記号( '%')。これは引数を消費しません。

Custom formatters

debug.formattersオブジェクトを拡張することで、カスタムフォーマッターを追加できます。たとえば、バッファーを%hて16進数としてレンダリングするサポートを追加する場合は、次のようにします。

1 2 3 4 5 6 7 8 9
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

ブラウザのサポート

あなたは使用してブラウザ対応のスクリプトを構築することができbrowserify 、または単に使用browserifyサービスとしてのビルドをあなたはそれを自分でビルドしたくない場合は、。

デバッグの有効化状態は現在localStorageによって永続化されていlocalStorage worker:aworker:b 、両方をデバッグしたい以下の状況を考えてみてください。これは、 localStorage.debugを使用localStorage.debug有効にできlocalStorage.debug

1
localStorage.debug = 'worker:*'

次に、ページを更新します。

1 2 3 4 5 6 7 8 9 10
a = debug('worker:a'); b = debug('worker:b'); setInterval(function(){ a('doing some work'); }, 1000); setInterval(function(){ b('doing some work'); }, 1200);

出力ストリーム

デフォルトでは、 debugはstderrにログを記録しますが、これはlogメソッドをオーバーライドすることで名前空間ごとに構成できます。

stdout.jsの例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
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 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');

動的に設定

enable()メソッドを呼び出して、デバッグを動的に有効にすることもできます。

1 2 3 4 5 6 7 8 9 10
let 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'));

印刷:

1 2 3
1 false 2 true 3 false

使用法:
enable(namespaces)
namespacesは、コロンとワイルドカードで区切ったモードを含めることができます。

enable()を呼び出すとenable()以前に設定されたDEBUG変数が完全にオーバーライドされることenable()注意してください。

1 2
$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))' => false

デバッグターゲットが有効になっているかどうかの確認

デバッグインスタンスを作成した後、 enabledプロパティを確認することで、それが有効になっているかどうかを判断enabledます。

1 2 3 4 5
const debug = require('debug')('http'); if (debug.enabled) { // do stuff... }

このプロパティを手動で切り替えて、デバッグインスタンスを強制的に有効または無効にすることもできます。

著者

  • TJホロウェイチュク
  • ネイサン・ラジリッヒ
  • アンドリュー・ライン

後援者

毎月の寄付で私たちをサポートし、私たちの活動を継続するのを手伝ってください。[後援者になる]

スポンサー

スポンサーになり、サイトへのリンクを含むGithubのREADMEでロゴを取得します。[スポンサーになる]

ライセンス

(MITライセンス)

Copyright(c)2014-2017 TJ Holowaychuk < tj@vision-media.ca >

これにより、このソフトウェアおよび関連するドキュメントファイル(「ソフトウェア」)のコピーを取得するすべての人に、使用、コピー、変更、マージの権利を含むがこれに限定されない制限なしにソフトウェアを取り扱う許可が無料で付与されます。以下の条件を条件として、本ソフトウェアのコピーを公開、配布、サブライセンス、および/または販売し、本ソフトウェアが提供される人にそうすることを許可すること。

上記の著作権通知およびこの許可通知は、本ソフトウェアのすべてのコピーまたは大部分に含まれるものとします。

本ソフトウェアは「現状有姿」で提供され、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的ないかなる種類の保証もありません。いかなる場合も、著者または著作権を保持するものではありません。契約、拷問、またはその他の行為にかかわらず、本ソフトウェアまたは本ソフトウェアの使用またはその他の取引に起因する、または関連する、請求、損害、またはその他の責任。