私のノードアプリケーションでは、winstonモジュールを使用してアプリケーションログを保存しています。ログは2つの形式で保存できます。1つはjsonで、もう1つは文字列です。ウィンストンでログを文字列として保存しているときに、ログ形式を下回っています。
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!!!');
私は同じことを考えていて、大丈夫な解決策を見つけました(理想的な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
は、logメソッド呼び出しに渡されるすべてのオブジェクト引数に設定されることに注意してください。したがって、渡されたオブジェクトを処理するための戦略を考え出す必要があります(または単にオブジェクト全体をJSONとして出力します)。例えば:
var error = {
name: 'MongoError',
code: 11000,
err: 'insertDocument :: caused by :: 11000 E11000 duplicate key error...'
}
logger.info('Some error ocurred: ', error);
args.meta
がエラー変数に設定される結果になります。
ご覧のとおり、この方法でログメッセージを処理する場合は、かなりの量を処理する必要があります。これらのことを行うためのより良い方法があったとしても私は驚かないでしょうが、うまくいけば、これはあなた(または他の誰か)を助けるでしょう。