2017-02-17 5 views
1

デバッグ文字列を使用して、ループバック2.0アプリケーションをデバッグします。 Loopback documentationは言う:ループバック2.0でデバッグ文字列を動的に設定する

ループバックフレームワークはデバッグに を助けるために、組み込みのデバッグ文字列の数を持っています。次のように 環境変数経由でコマンドライン上の文字列を指定します。

のMacOSとLinux

$ DEBUG=<pattern>[,<pattern>...] node .

実行時に動的にパターンを変更することが可能ですか?またはenvironment-specific configurationを使用できますか?

答えて

0

私は、このデバッグロギング機能がほぼすべてのロジックを処理するvisionmedia's debug moduleを使用していることに注意しています。

実行時に動的にパターンを変更できますか?

どのモジュールがロードされているまあ前に、私はちょうど環境変数を操作することであると信じて最も安全で最良の方法:

if (process.env.NODE_ENV === 'development') { 
    process.env.DEBUG = process.env.DEBUG + ',loopback:*'; 
} 

debugをロードし、それが.enable方法の使用には、もう一つの方法は、次のようになります。

require('debug').enable('loopabck:*'); 

しかし、Loopbackが必要になる前にこれを行うのは、インスタンスが作成される前にのみ変更が許可されるためです。この場合、lo opbackが読み込まれます。別のことは、依存関係とパッケージマネージャ(npm @ 3、npm @ 2と糸の動作が異なる)に応じて、複数のデバッグモジュールがインストールされている可能性があります。 debugがnode_modulesディレクトリにあるか、各モジュールのnode_modulesディレクトリにループバックされている可能性があります。このようにしたい場合は、すべてのインスタンスを必要とし、有効にしてください。

スタートアップ時に実行したくない場合、ウェルAPIは実行時に変更を許可しません。このhereに関するディスカッションを閲覧することができます。それを回避するにはいくつかの汚い方法がありますが、将来的にこれらが壊れる可能性があるので注意してください。

はまず、おそらくまた、以前に作成したインスタンス上require('debug').enable作業を行いhot-debugと呼ばれるモジュールがありますが、私はそれをしようとしたとき、それは完全に動作しませんでしたし、それはバグだらけだったが、それはそれはあなたのために正常に動作可能性があることが可能です。

これがうまくいかない場合は、require('debug').logメソッドをオーバーライドする方法があります。これが定義されている場合、debugは、フォーマットされた引数を使用してconsole.logの代わりにこのメソッドを呼び出します。あなたはDEBUG=*を設定し、それを自分でフィルタリングすることができますなど、すべてのデバッグ出力が何もコンソールに出力されないかもしれないにもかかわらず、濾過する前にフォーマットされますけれども

require('debug').log = function (string) { 
    if (string.contains('loopback:security')) { 
     console.log(string); 
    } 
}; 

この方法では、生産が遅くなります。

require('debug').initメソッドを上書きするもう1つのこと。これは、新しいデバッグインスタンスが作成されるたびに呼び出されます。 debugのインスタンスはすべてenabledプロパティを使用して、有効になっているかどうかをチェックするので、それを切り替えることができます。

const debug = require('debug'); 
const { init } = debug; 
const instances = []; 
debug.init = function(debugInstance) { 
    init(debugInstance); 
    instances.push(debugInstance); 
}; 

// You can call this function later to enable a given namespace like loopback.security.acl 
function enableNamespace(namespace) { 
    instances.forEach(instance => { 
    instance.enabled = instance.namespace === namespace; 
    }); 
} 

これには多くの改善がありますが、あなたはそのアイデアを得ることができます。

+0

詳細な回答ありがとうございます。いくつかの異なるソリューションが含まれていますが、正解とマークします。個人的に環境変数を操作する私のためには完璧に動作します。 – Serg

+0

ようこそ、異なるユースケースのために、さまざまなソリューションがあります。 –

関連する問題