log4js のログフォーマット / Node.js + Express

以前のエントリ(Node.js + Express + log4js)ではちゃんとふれませんでしたが、log4js-node では出力フォーマットを指定することができます。そもそもデフォルトはスペース区切りで必要のない情報が出力され、必要な情報が出力されないような使えないログなので、適切にフォーマットすることをおすすめします。

ログフォーマットの指定

ログフォーマットは先述したエントリにあるとおり app.configure で app.use するときに指定すればOKです。

app.configure(function(){
    log4js.configure({
        'appenders': [
            { 'type': 'console' }, // console に出力
            {
                'type': 'file',
                'filename': 'path/to/logfile',
                // 1024 * 1024 byte = 1MB
                'maxLogSize': 1024 * 1024,
                'backups': 5,
                // stdoutへの出力も拾う
                'category': [ 'project-name', 'console' ],
            },
        ],
        'replaceConsole': true // stdoutへの出力も拾う
    });

    var logger = log4js.getLogger('project-name');
    app.use(log4js.connectLogger(logger, {
        'level': log4js.levels.DEBUG,
        // アクセスログを出力する際に無視する拡張子
        'nolog': [ '\\css', '\\.js', '\\.gif' ],
        // アクセスログのフォーマット(以下はデフォルト出力)
        'format': ':remote-addr - - ":method :url HTTP/:http-version" :status :content-length ":referrer" ":user-agent"'
    }));
    app.use(app.router);
});

ここで log4js.connectLogger に渡しているオプション format に文字列としてフォーマットを渡すことになります。

オプション format に指定できるのはソース(https://github.com/nomiddlename/log4js-node/blob/master/lib/connect-logger.js#L10) からも確認できるように

- `:req[header]` ex: `:req[Accept]`
- `:res[header]` ex: `:res[Content-Length]`
- `:http-version`
- `:response-time`
- `:remote-addr`
- `:date`
- `:method`
- `:url`
- `:referrer`
- `:user-agent`
- `:status`

です。コードを見てわかるとおり、単純に String#replace しているだけなので、例えば :methodo と指定すると GETo や POSTo が出力されます。

せっかくの JavaScript ですので、JSON フォーマットで出力してみます。出力するデータは適宜調整してください(req[header] や res[header] は実際に request/response オブジェクトから取得できるデータならなんでもOKなので、console.log(request) / console.log(response) してみて、出力するデータを決めるといいかもしれません。response の中に request がいたりしてうっとうしいですが)

    app.use(log4js.connectLogger(logger, {
        'level': log4js.levels.DEBUG,
        // アクセスログを出力する際に無視する拡張子
        'nolog': [ '\\css', '\\.js', '\\.gif' ],
        // アクセスログのフォーマット(JSON 形式)
        'format': JSON.stringify({
            'remote-addr': ':remote-addr',
            'method': ':method',
            'url': ':url',
            'http-version': ':http-version',
            'status': ':status',
            'content-length': ':content-length',
            'referrer': ':referrer',
            'user-agent': ':user-agent'
        })
    }));