Express4 + log4jsでロギング
兎にも角にも「ログ」は大事。
Express4 + log4jsでロギングをつくっていく。
まずはlog4jsモジュールのインストール。
npm install log4js --save
用意するログの種類は以下の通りとする。
category | 用途 |
---|---|
access | アクセスログ |
error | エラーログ |
system | 上記二つに当てはまらないもの |
各ログの設定を作るのだが、例によって環境によって動作を変えたいと思う。
例えば、本番環境ではデバッグ用のログは吐き出す必要はない。
環境ごとに設定をつくる方法はExpress4で環境ごとの設定をつくるに書いたので参考に。
vi config/development.json
{
"log4js": {
"appenders": [{
"category": "access",
"type": "dateFile",
"filename": "/tmp/access.log",
"pattern": "-yyyy-MM-dd",
"backups": 3
},
{
"category": "system",
"type": "dateFile",
"filename": "/tmp/system.log",
"pattern": "-yyyy-MM-dd",
"backups": 3
},
{
"category": "error",
"type": "dateFile",
"filename": "/tmp/error.log",
"pattern": "-yyyy-MM-dd",
"backups": 3
},
{"type": "console"}],
"levels": {
"access": "ALL",
"system": "ALL",
"error": "ALL"
}
}
}
appendars要素にログの種類分の設定をしている。
要素 | 内容 |
---|---|
category | 種類を特定できる文字列 |
type | console(コンソール) file(ファイル) dateFile(rotate付ファイル) |
filename | 出力先ファイル名 |
pattern | dateFileの場合のファイル末尾のパターン |
backups | 過去分としてのこしておくログファイル数 |
appendars要素に {"type": "console"} も設定しておくと、ファイル書き出しと同時にコンソールにも表示してくれて便利。
levels要素は対象のログ種類で、どのレベル以上のログを書き出し可能かを制御できる。
レベル | 内容 |
---|---|
ALL | 全てのログが書き出される |
DEBUG | DEBUG以上のログが書き出される |
INFO | INFO以上のログが書き出される |
WARN | WARN以上のログが書き出される |
ERROR | ERROR以上のログが書き出される |
設定を読み込んでロガーを初期化するコードを毎回書くのが面倒なので、モジュール化しておく。
mkdir modules
vi modules/logger.js
var log4js = require('log4js');
var config = require('config');
log4js.configure(config.log4js);
module.exports = {
access: log4js.getLogger('access'),
system: log4js.getLogger('system'),
error: log4js.getLogger('error'),
express: log4js.connectLogger(log4js.getLogger('access'), {level: log4js.levels.INFO})
};
最後にExpressのデフォルトロガーをlog4jsに変更する。
vi app.js
...
...
// デフォルトはmorganというモジュールを使っているので、コメントアウトして作成したモジュールを使う。
//var logger = require('morgan');
var logger = require('./modules/logger');
...
...
// app.use(logger('dev'))している行をコメントアウトして、logger.expressをapp.useする
//app.use(logger('dev'));
app.use(logger.express);
ここまで出来ればあとは使うだけ。
var logger = require('./modules/logger');
logger.system.info({
name: "tnnsst35",
message: "byebye"
});
以上。