log4jsはjavascriptのログ出力モジュールです。
log4jsをインストールする
$ npm install log4js
ログ出力設定ファイルを作成する
{
"appenders": [
{
"type": "dateFile",
"category": "system",
"filename": "logs/system.log",
"pattern": "-yyyy-MM-dd"
},
{
"type": "dateFile",
"category": "access",
"filename": "logs/access.log",
"pattern": "-yyyy-MM-dd"
},
{
"type": "dateFile",
"category": "error",
"filename": "logs/error.log",
"pattern": "-yyyy-MM-dd"
}
}
-
appenders
ログの出力処理の指定。ログの出力方式を配列で複数指定可能。 -
type
ログの出力タイプを指定。
値 | 説明 |
---|---|
file | ファイルに書き出す。 |
datefile | 日付毎にローテーションしてファイルに書き出す。 |
console | コンソールに書き出す。 |
-
category
出力するログのカテゴリ。カテゴリ毎に出力内容を分けることができる。 -
filename
ログの出力先(ファイル名) -
pattern
ファイルの出力パターン
書式 | 説明 |
---|---|
yyyy | 西暦を4桁 |
yy | 西暦2桁 |
MM | 月 |
dd | 日 |
hh | 時間(24時間表示) |
mm | 分 |
ss | 秒 |
sss | ミリ秒 |
O | タイムゾーン |
上の例では、filenameが"system.log"でpatternが”-yyyy-MM-dd”なのでローテーションのタイミング(AM:0:00)でsystem-yyyy-MM-dd.logになります。
$ ls logs
access.log error.log system.log
access.log-2014-11-29 error.log-2014-11-29 system.log-2014-11-29
ログを出力してみる
作成したapp.jsは以下です。
var Log4js = require('log4js');
// 設定ファイル(log-config.json)の読み込み
Log4js.configure('log-config.json');
// ログ出力
var systemLogger = Log4js.getLogger('system');
var accessLogger = Log4js.getLogger('access');
var errorLogger = Log4js.getLogger('error');
// Informationログを出力する
systemLogger.info('this is system log!!!');
accessLogger.info('this is access log!!!');
errorLogger.info('this is error log!!!');
$ ls logs まだファイルは作成されていない
$ node app.js 上記で作成したapp.jsを実行
$ ls logs ログファイルが作成されている
access.log error.log system.log
作成されたログファイルは次の通り。
[2014-11-29 01:44:54.322] [INFO] system - this is system log!!!
[2014-11-29 01:44:54.324] [INFO] access - this is access log!!!
[2014-11-29 01:44:54.324] [INFO] error - this is error log!!!
ログレベルに応じたログ出力
log4jsではFATAL、ERROR、WARN、INFO、DEBUG、TRACEのログ出力ができる。
var Log4js = require('log4js');
// 設定ファイル(log-config.json)の読み込み
Log4js.configure('log-config.json');
// ログ出力
var systemLogger = Log4js.getLogger('system');
// Fatalログを出力する
systemLogger.fatal('this is system log!!!');
// Errorログを出力する
systemLogger.error('this is system log!!!');
// Warningログを出力する
systemLogger.warn('this is system log!!!');
// Informationログを出力する
systemLogger.info('this is system log!!!');
// Debugログを出力する
systemLogger.debug('this is system log!!!');
// traceログを出力する
systemLogger.trace('this is system log!!!');
実際に出力するとこんな感じになります。
[2014-11-29 21:16:34.628] [FATAL] system - this is system log!!!
[2014-11-29 21:16:34.630] [ERROR] system - this is system log!!!
[2014-11-29 21:16:34.630] [WARN] system - this is system log!!!
[2014-11-29 21:16:34.630] [INFO] system - this is system log!!!
[2014-11-29 21:16:34.630] [DEBUG] system - this is system log!!!
[2014-11-29 21:16:34.631] [TRACE] system - this is system log!!!
出力するログレベルを設定するには、設定ファイルにlevelsプロパティを設定できます。
{
"appenders": [
{
"type": "dateFile",
"category": "system",
"filename": "logs/system.log",
"pattern": "-yyyy-MM-dd"
}
],
"levels": {"system": "INFO"} ← ココ
}
これで実行すると、category = "system"ののログがINFOレベル以上のログになります。
[2014-11-29 23:12:49.403] [FATAL] system - this is system log!!!
[2014-11-29 23:12:49.406] [ERROR] system - this is system log!!!
[2014-11-29 23:12:49.406] [WARN] system - this is system log!!!
[2014-11-29 23:12:49.407] [INFO] system - this is system log!!!
指定できるログレベルは以下の様です。
ログレベル | 説明 |
---|---|
OFF | ログファイルにログを出力ません。 |
FATAL | FATAL以上のレベルのログを出力。 |
ERROR | ERROR以上のレベルのログを出力。 |
WARN | WARN以上のレベルのログを出力。 |
INFO | INFO以上のレベルのログを出力。 |
DEBUG | DEBUG以上のレベルのログを出力。 |
TRACE | TRACE以上のレベルのログを出力。 |
ALL | 全てのログレベルの出力を行う |
コンソールにログを出力する。
appendersに「type:console」で追記します。
{
"appenders": [
{
"type": "dateFile",
"category": "system",
"filename": "logs/system.log",
"pattern": "-yyyy-MM-dd"
},
{
"type": "dateFile",
"category": "access",
"filename": "logs/access.log",
"pattern": "-yyyy-MM-dd"
},
{
"type": "dateFile",
"category": "error",
"filename": "logs/error.log",
"pattern": "-yyyy-MM-dd"
},
{ "type": "console" } ←ココ追加
],
"levels": {"system": "DEBUG"}
}
実行するとこんな感じで出力されます。
$ node app.js
[2014-11-29 23:31:05.041] [FATAL] system - this is system log!!!
[2014-11-29 23:31:05.043] [FATAL] access - this is access log!!!
[2014-11-29 23:31:05.043] [FATAL] error - this is error log!!!
[2014-11-29 23:31:05.044] [ERROR] system - this is system log!!!
[2014-11-29 23:31:05.044] [ERROR] access - this is access log!!!
[2014-11-29 23:31:05.044] [ERROR] error - this is error log!!!
[2014-11-29 23:31:05.044] [WARN] system - this is system log!!!
[2014-11-29 23:31:05.044] [WARN] access - this is access log!!!
[2014-11-29 23:31:05.044] [WARN] error - this is error log!!!
[2014-11-29 23:31:05.045] [INFO] system - this is system log!!!
[2014-11-29 23:31:05.045] [INFO] access - this is access log!!!
[2014-11-29 23:31:05.045] [INFO] error - this is error log!!!
[2014-11-29 23:31:05.045] [DEBUG] system - this is system log!!!
[2014-11-29 23:31:05.045] [DEBUG] access - this is access log!!!
[2014-11-29 23:31:05.045] [DEBUG] error - this is error log!!!
[2014-11-29 23:31:05.046] [TRACE] access - this is access log!!!
[2014-11-29 23:31:05.047] [TRACE] error - this is error log!!!
replaceConsoleプロパティを追加すると、console.logで出力した内容がログ形式になります。
replaceConsoleプロパティ追加前
[2014-11-29 23:38:50.833] [TRACE] error - this is error log!!!
ログ出力のテスト!!!
replaceConsoleプロパティ追加
{
"appenders": [
{
"type": "dateFile",
"category": "system",
"filename": "logs/system.log",
"pattern": "-yyyy-MM-dd"
},
{
"type": "dateFile",
"category": "access",
"filename": "logs/access.log",
"pattern": "-yyyy-MM-dd"
},
{
"type": "dateFile",
"category": "error",
"filename": "logs/error.log",
"pattern": "-yyyy-MM-dd"
},
{ "type": "console" }
],
"levels": {"system": "DEBUG"},
"replaceConsole": true ← ココ追加
}
実行すると、こんな感じです。
[2014-11-29 23:41:14.642] [TRACE] error - this is error log!!!
[2014-11-29 23:41:14.642] [INFO] console - ログ出力のテスト!!!
設定ファイルのリロード時間を設定
設定ファイルの読み込み部分を次の様に変更すると指定した時間(秒単位)でリロードしてくれる様になります。ここでは60秒毎にリロードします。
Log4js.configure('log-config.json', { reloadSecs: 60 });
設定ファイルの最大サイズやバックアップ数を指定する。
最大ログサイズの指定やバックアップ数も指定できる様です。
-
maxLogSize
ファイルの最大ファイルサイズ(単位:byte) -
backups
バックアップ数
どうも、appendersのtypeがfileの時に機能するみたいです。
{
"appenders": [
{
"type": "file",
"category": "system",
"maxLogSize": 1048576,
"backups": 3,
"filename": "logs/system.log"
},
{
"type": "dateFile",
"category": "access",
"filename": "logs/access.log",
"pattern": "-yyyy-MM-dd"
},
{
"type": "dateFile",
"category": "error",
"filename": "logs/error.log",
"pattern": "-yyyy-MM-dd"
},
{ "type": "console" }
],
"levels": {"system": "INFO"},
"replaceConsole": true
}
expressとのログの統合
expressの設定時に次の内容を追記すれば良い様です。
Log4js = require('log4js');
:
:
Log4js.configure Config.log.configure
logger = Log4js.getLogger 'system'
app = express()
:
:
app.use(log4js.connectLogger(logger));
// app.use(Log4js.connectLogger(logger, { level: Log4js.levels.INFO }));