はじめに
Node.jsのWebフレームワークExpressはexpress-generator
を使うとアプリケーションの雛形を作成してくれます。
この雛形はHTTPリクエストロガーのmorganが含まれていますが、メッセージフォーマットくらいしかカスタマイズできません。
そこで他のロガーと連携してみました。ここではwinstonを使ってみます。
連携方法
GitHubのページでは以下のようにstream
プロパティでファイルに出力しています。
expressjs/morgan # write logs to a file
// create a write stream (in append mode)
var accessLogStream = fs.createWriteStream(__dirname + '/access.log', {flags: 'a'})
// setup the logger
app.use(morgan('combined', {stream: accessLogStream}))
このstream
プロパティがどのように使われているのか追跡すると以下のようにwrite
関数を呼び出しています。
stream.write(line + '\n')
つまり、次のような形で他のロガーと連携できるはずです。
app.use(require('morgan')({
stream: {
write: function(message) {
// ここでmessageをログ出力すればよい!
}
}})
);
winstonと連携する
winstonのカスタムロガーと連携する場合は以下のようなコードになります。
// winstonでカスタムロガー作成
var winston = require('winston');
winston.emitErrs = true;
var logger = new winston.Logger({
level: 'info',
transports: [
new (winston.transports.Console)({
level: 'silly',
handleExceptions: true,
json: false,
colorize: true
}),
new (winston.transports.File)({
handleExceptions: true,
json: false,
colorize: false,
filename: './logs/all-logs.log'
})
]
});
// 連携用のwrite関数
logger.stream = {
write: function (message) {
logger.info(message);
}
};
// morganと連携
app.use(require('morgan')({stream: logger.stream}));
// アプリログはlogger.info()などで出力する