2012-02-21 17 views
13

私は、ログ用にNode.jsにWinstonを使用しています。私は各ログメッセージに個別にメタデータを追加できることは知っていますが、毎回指定したくないため、すべてのログメッセージ(アプリケーション名など)に追加されるデフォルトのメタデータセットを指定する方法があります私はログメッセージを送る必要があります。Node.js:Winston:すべてのログメッセージにデフォルトのメタデータを追加できますか?

+0

これを行うには、文書化の方法が用意されました、私の答えを参照してください。 – DrakaSAN

答えて

16

はこれを行うには、組み込みの方法はありませんが、あなたは間違いなくそれを自分で追加することができます - ここでの方法は次のとおりです。

まず、通常はあなたのようなあなたのロガーを考え設定します。たとえば:

var logger = new (winston.Logger)({ 
      "exitOnError" : true, 
      "transports" : [ 
       new (winston.transports.Console)({ "colorize" : true, "level" : "silly", "silent" : false, "handleExceptions" : false }), 
      ] 
     }); 

は、次に(これは常にレベルのメソッドによって呼び出された - logger.foo()が実際にlogger.log('foo')呼び出します。)ログ()メソッドをオーバーライド

logger.log = function(){ 
    var args = arguments; 
    if(args[2]) args[3] = args[2]; 
    args[2] = { 
    "foo" : "bar" 
    } 
    winston.Logger.prototype.log.apply(this,args); 
} 

私は上記のやっているすべては、それを作っていますlogger.log()が呼び出されると、上記のメソッドが呼び出され、メタデータ(この場合はfooキーを含むオブジェクト)が追加されます。次に、適切なコンテキストからwinstonのLogger.logメソッドを呼び出します。

上記のコードは、単にロガーをエクスポート下部に、作成したモジュールに次のようになります。

module.exports = logger;

とあなたのサブクラスでウィンストンモジュールの代わりにロガーモジュールをインポートします。

var logger = require('./logger.js');

役に立てば幸い!

+0

Thanks Jesse :) –

+1

注:これは、ログ・ステートメントで指定したメタデータをすべて上書きします。これを補うためにアンダースコアの '_.defaults()'を使うことができます。あるいは、args [2]のチェックを追加して、これを回避するために存在する場合は上書きすることはできません。 – Jesse

+1

引数を上書きするのではなく、単に引数を追加します。 logger.log = function(){ var args = arguments; if(args [2]){ args [2] .foo = "bar" } winston.Logger.prototype.log.apply(this、args); } – harryBundles

3

以上のlog4j(S)のような出力を持つ別のオプション:

出力(JSONまたはライン)にラベルを追加しますコンソールの輸送で(現在は文書化されていない)「ラベル」プロパティがあります:

var logger = require('./logger')(__filename); 

出力例:

var _ = require('lodash'); 
var winston = require('winston'); 
var path = require('path'); 
var baseDir = path.resolve(__dirname, '..'); 

// SETUP WINSTON LOGGER 
var container = new winston.Container(); 
container.add("exception", { 
    console: { 
     handleExceptions: true, 
     timestamp: true, 
     label: "EXCEPTION", 
     colorize: true 
    } 
}); 
container.get("exception").exitOnError = false; 
var keys = []; 

module.exports = function(filename) { 
    var label = path.relative(baseDir, filename); 
    if (!_.contains(keys, label)) { 
     container.add(label, { 
      console: { 
       handleExceptions: false, 
       level: 'debug', 
       timestamp: true, 
       label: label, 
       colorize: true 
      } 
     }); 
     keys.push(label); 
    } 
    var logger = container.get(label); 
    logger.exitOnError = false; 
    return logger; 
}; 

そして、他のモジュールでは、このようにそれを必要と

2014-07-23T07:05:27.770Z - info: [config/config.js] ....... 
0

this blogに基づいてutil-extendを使用してより良い方法を見つけました。 Logger.infoとlogger.log( "info"、message)をキャッチするのに便利だとわかったすべてのケースでデータを追加し、他の引数を上書きしません。

logger.log = function(){ 
    var args = arguments; 
    var level = args[0]; 

    var newArgs = { 
     foo: "bar", 
     baz: "abc" 
    }; 
    var originalMeta = args[2] || {}; 
    args[2] = extend(originalMeta, newArgs); 

    winston.Logger.prototype.log.apply(this,args); 
}; 

コンソールとログに出力されます。ウィンストンv2の

28

(コメントを参照してください)

rewritersはこれを行うための文書化され、公式の方法であること、今があります:

logger.rewriters.push(function(level, msg, meta) { 
    meta.app = 'myApp'; 

    return meta; 
}); 

このthrought行くすべてのメタデータプロパティappが追加されますロガー。ロガーを構築する際に
また、それを宣言することができます。

new (winston.Logger)({ 
     level: config.log[file].level, 
     rewriters: [ 
      (level, msg, meta) => { 
       meta.app = 'myApp'; 
       return meta; 
      } 
     ], 
     transports: [ 
      /*your transports*/ 
     ] 
}); 
+1

この回答は、より適切かつ公式な方法です。 – shankshera

+0

正解である必要があります –

+0

winston v3はメタデータを変更する可能性を排除しているようです。つまり、メタデータを追加する場合は、@Jesseがwinston v3&+の推奨ソリューションです。出力ログがJSONではなく文字列の場合、カスタムフォーマットでジョブを実行できます(cfgithub.com/winstonjs/winston/issues/1140) –

関連する問題