16

ノード アプリケーションでは、winston モジュールを使用してアプリケーション ログを保存しています。ログは、json 形式と文字列形式の 2 つの形式で保存できます。winston でログを文字列として保存しているときに、ログ形式を下回っています。

  2013-09-10T06:51:34.199Z - error: error message!!!
       (timestamp)     -    (level) : (log message)

ここで、上記のログ形式を次のように変更します。

    2013-09-10T06:51:34.199Z/error/error message!!!
       (timestamp)    /     (level) / (log message)

これはどのように達成できますか?

私のコード

  var winston = require('winston');
  winston.loggers.add('category1', {
   file: {
      filename: '/path/to/some/file',json:false
     }
  });              
  var category1 = winston.loggers.get('category1');
  category1.log('error','error message!!!');
4

1 に答える 1

16

私は同じことを考えていて、大丈夫な解決策を見つけました(理想的なIMOではないので、おそらく他の誰かがこれについて検討することができます)。

トランスポート オブジェクトにフォーマッタ関数を提供することで、ロガー出力を完全にカスタマイズできます。必要に応じてフォントを手動で色付けする必要があるため、コンソールよりもファイル トランスポートの方が適している場合があります。

これは、使用できる(そして必要に応じて調整できる)比較的単純なフォーマッタ関数です。

// Define options for Date#toLocaleTimeString call we will use.
var twoDigit = '2-digit';
var options = {
  day: twoDigit,
  month: twoDigit,
  year: twoDigit,
  hour: twoDigit,
  minute: twoDigit,
  second: twoDigit
};

function formatter(args) {
  var dateTimeComponents = new Date().toLocaleTimeString('en-us', options).split(',');
  var logMessage = dateTimeComponents[0] + dateTimeComponents[1] + ' - ' + args.level + ': ' + args.message;
  return logMessage;
}

このフォーマッタをトランスポートで使用するには、関数を渡すようにコードを調整するだけです。

winston.loggers.add('category1', {
  file: {
    filename: '/path/to/some/file',
    json: false,
    formatter: formatter
  }
});

プロパティargs.metaは、ログ メソッド呼び出しに渡される任意のオブジェクト引数に設定されることに注意してください。そのため、渡されたオブジェクトを処理するための戦略を考え出す必要があります (または、オブジェクト全体を JSON として出力するだけです)。例えば:

var error = {
  name: 'MongoError',
  code: 11000,
  err: 'insertDocument :: caused by :: 11000 E11000 duplicate key error...'
}
logger.info('Some error ocurred: ', error);

args.metaエラー変数に設定されます。

ご覧のとおり、この方法でログ メッセージを処理する場合、かなりの量の処理を行う必要があります。これらのことを行うためのより良い方法があったとしても驚かないでしょうが、うまくいけば、これがあなた(または他の誰か)を助けるでしょう.

于 2015-02-18T06:03:34.443 に答える