8
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

Expressのmorganと他のロガーを連携する

はじめに

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関数を呼び出しています。

morgan / index.js#L130

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()などで出力する

参考

stackoverflow # Node.js - logging / Use morgan and winston

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
8
Help us understand the problem. What are the problem?