FledglingRobin’s diary

Github: https://github.com/FledglingRobin

log4js-nodeのおさらい

なんとなくで使い始めたlog4js、改めておさらいをしておく。

github.com

log4js-nodeってなんだろう

Node.jsでlogをとるときに便利なフレームワークJavaで使われていたLog4J、それをJavaScript用に実現したLog4jsをNode.js向けにしたものがlog4js-node。npm installする際にはnpm install log4jsと書き、-nodeの部分はつけなくていい。

log4js-nodeでできること

たとえば、下記のようなことができる。

  • consoleに色付きでログを出力させる
  • Node.jsのconsole.logをおきかえる
  • ファイルサイズや日付でログをわける

使ってみる

log4js.getLoggerでloggerを用意して、logger.debug関数でログを記述していく。

var log4js = require('log4js');
var logger = log4js.getLogger();
logger.debug("Some debug messages");

日付とDEBUGdefaultの部分に色がついてconsoleに表示される。

$ node log4js_test.js 
[2017-01-06 17:29:46.544] [DEBUG] [default] - Some debug messages

ファイルに記録させる

console出力だけじゃなく、logファイルに書き出ささせることができる。

var log4js = require('log4js');
log4js.loadAppender('file');
log4js.addAppender(log4js.appenders.file('logs/console.log'));

var logger = log4js.getLogger();
logger.debug("Some debug messages");
$ node log4js_test.js 
[2017-01-06 17:37:15.824] [DEBUG] [default] - Some debug messages
$ ls logs/
console.log
$ cat logs/console.log 
[2017-01-06 17:37:15.824] [DEBUG] [default] - Some debug messages

ログレベルをわけることができる

debugログ以外のログレベルも利用できる。

  • trace
  • debug
  • info
  • warn
  • error
  • fatal
var log4js = require('log4js');
log4js.loadAppender('file');
log4js.addAppender(log4js.appenders.file('logs/console.log'));
var logger = log4js.getLogger();

// 実際にログを出力してみる
logger.trace('traceログです');
logger.debug('デバッグログです');
logger.info('infoログです');
logger.warn('警告です');
logger.error('エラーがでました');
logger.fatal('致命的な問題です');

出力がカラフルでとてもかわいい。

$ node log4js_test.js 
[2017-01-06 17:41:48.087] [TRACE] [default] - traceログです
[2017-01-06 17:41:48.093] [DEBUG] [default] - デバッグログです
[2017-01-06 17:41:48.094] [INFO] [default] - infoログです
[2017-01-06 17:41:48.094] [WARN] [default] - 警告です
[2017-01-06 17:41:48.094] [ERROR] [default] - エラーがでました
[2017-01-06 17:41:48.094] [FATAL] [default] - 致命的な問題です

低いレベルのログを無視する

setLevelを使うと、どのレベル以上のログを表示するか設定できる。

var log4js = require('log4js');
log4js.loadAppender('file');
log4js.addAppender(log4js.appenders.file('logs/console.log'));

// loggerを用意する
var logger = log4js.getLogger();
logger.setLevel('ERROR');

// 実際にログを出力してみる
logger.trace('traceログです');
logger.debug('デバッグログです');
logger.info('infoログです');
logger.warn('警告です');
logger.error('エラーがでました');
logger.fatal('致命的な問題です');

この場合はlogger.setLevel('ERROR');で、errorfatalのほかが無視されている。

$ node log4js_test.js 
[2017-01-06 17:45:06.062] [ERROR] [default] - エラーがでました
[2017-01-06 17:45:06.069] [FATAL] [default] - 致命的な問題です
$ cat logs/console.log 
[2017-01-06 17:45:06.062] [ERROR] [default] - エラーがでました
[2017-01-06 17:45:06.069] [FATAL] [default] - 致命的な問題です

設定をまとめて書く

var log4js = require('log4js');
log4js.loadAppender('file');
log4js.addAppender(log4js.appenders.file('logs/console.log'));

この部分をまとめて記述することができる。{type: 'console'}を外すとconsole出力がなくなる。{type: 'file', filename: 'logs/console.log'}を外すとファイル出力がなくなる。

var log4js = require('log4js');
log4js.configure({
  appenders: [
    {type: 'console'},
    {type: 'file', filename: 'logs/console.log'}
  ]
});

この設定は外部ファイルに記述することもできる。これが使いやすそう。

var log4js = require('log4js');
log4js.configure('config/log4js.json');

// loggerを用意する
var logger = log4js.getLogger();
logger.setLevel('ERROR');

// 実際にログを出力してみる
logger.trace('traceログです');
logger.debug('デバッグログです');
logger.info('infoログです');
logger.warn('警告です');
logger.error('エラーがでました');
logger.fatal('致命的な問題です');
{
    "appenders": [{
            "type": "console"
        },
        {
            "type": "file",
            "filename": "logs/console.log"
        }
    ]
}

Nodeのconsole.log上書き

標準だとconsole.logは上書きされない。

var log4js = require('log4js');
log4js.configure('config/log4js.json');

// loggerを用意する
var logger = log4js.getLogger();
logger.setLevel('ERROR');

// 実際にログを出力してみる
console.error('Node.jsのconsole.errorです');
$ node log4js_test.js 
Node.jsのconsole.errorです

Nodeのconsole.logを上書き利用する場合は、replaceConsoleの設定をする。

{
    "appenders": [{
            "type": "console"
        },
        {
            "type": "file",
            "filename": "logs/console.log"
        }
    ],
    "replaceConsole": true
}

これで、Node.jsのconsoleで書かれたlogをlog4jsで扱えるようになる。

$ node log4js_test.js 
[2017-01-06 18:33:15.227] [ERROR] console - Node.jsのconsole.errorです

logのカテゴリーをわける

たとえば送信時と受信時のlogをわけて保存したい場合。 まず、カテゴリーごとに保存先を指定しておく。

{
    "appenders": [{
            "type": "console"
        },
        {
            "type": "file",
            "filename": "logs/console_send.log",
            "category": "send"
        },
        {
            "type": "file",
            "filename": "logs/console_receive.log",
            "category": "receive"
        }
    ],
    "replaceConsole": true
}

カテゴリーの指定を変えてloggerを用意しておく。

var log4js = require('log4js');
log4js.configure('config/log4js.json');

// loggerを用意する
var loggerSend = log4js.getLogger('send');
var loggerReceive = log4js.getLogger('receive');

// 実際にログを出力してみる
loggerSend.info('サーバーがメッセージを送信しました');
loggerReceive.info('サーバーがメッセージを受信しました');

この結果、loggerSendloggerReceiveで保存先が変わる。

$ node log4js_test.js 
[2017-01-06 19:25:33.099] [INFO] send - サーバーがメッセージを送信しました
[2017-01-06 19:25:33.108] [INFO] receive - サーバーがメッセージを受信しました
$ cat logs/console_send.log 
[2017-01-06 19:25:33.099] [INFO] send - サーバーがメッセージを送信しました
$ cat logs/console_receive.log 
[2017-01-06 19:25:33.108] [INFO] receive - サーバーがメッセージを受信しました

日付ごとにファイルを変える

例えばpatternとして-yyyy-MM-ddを指定をすると、日付が変わる際にログファイルの末尾に-yyyy-MM-ddが付与される。

{
    "appenders": [{
            "type": "console"
        },
        {
            "type": "dateFile",
            "filename": "logs/console.log",
            "pattern": "-yyyy-MM-dd" 
        }
    ],
    "replaceConsole": true
}

expressと使う場合にはexpressのlogもlog4jsで扱うことができる

Connect Logger · nomiddlename/log4js-node Wiki · GitHub

最後に

log4js-nodeについてざっと振り返りをした。他にも設定できる項目があるので、使いながらくわしい動きを調べていきたい。