log4jsをインストールする

$ npm install log4js

ログ出力設定ファイルを作成する注意)Log4jsバージョン2以上から設定ファイルの仕様が変わりました。

log-config.json
{
    "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-2



Log4jsバージョン2以上から設定ファイルの仕様

Log4js v1.Xではappendersは配列だったけれど、Log4js v2.Xではappendersはオブジェクト
という大きな仕様変更があったみたいです。

ドキュメントを整理をすると、

  • log4js v2ではappenndersプロパティ、categoriesプロパティが必須のJSONで設定を行う。
  • appendersプロパティはオブジェクトとして、 設定名:{出力設定} というプロパティの列挙で各出力設定を用意する。
  • categoriesプロパティはオブジェクトとして、 カテゴリ名:{適用設定,出力ログレベル} というプロパティの列挙でログ定義をする。
  • categories::defaultプロパティは必須。

コレを上の設定ファイルに当てはめると以下のようになりました。

development.json.うごくやつ
{
    "log4js": {
        "appenders": {
            "access": {
                "type":     "dateFile",
                "filename": "/var/log/app/access.log"
            },
            "error": {
                "type":     "dateFile",
                "filename": "/var/logs/app/error.log"
            },
            "system": {
                "type":     "dateFile",
                "filename": "/var/log/app/system.log"
            },
            "console": {
                "type": "console"
            },
            "stdout": {
              "type": "stdout"
            }
        },
        "categories": {
            "default": {
                "appenders": [
                    "access"
                    ,"console"
                    ,"stdout"
                ]
                ,"level": "INFO"
            },
            "access": {
                "appenders": [
                    "access"
                    ,"console"
                    ,"stdout"
                ]
                ,"level": "INFO"
            },
            "system": {
                "appenders": [
                    "system"
                    ,"console"
                    ,"stdout"
                ]
                ,"level": "ALL"
            },
            "error": {
                "appenders": [
                    "error"
                    ,"console"
                    ,"stdout"
                ]
                ,"level": "WARN"
            }
        }
    }
}

この設定では、出力設定としては

  • access
  • error
  • system
  • console
  • stdout

の5つを用意していて、ログ設定としては

  • access
    • 出力設定→access,console,stdout
  • error
    • 出力設定→error,console,stdout
  • system
    • 出力設定→system,console,stdout

の3つを用意しています。この時、アプリケーションから使えるログはaccess,error,systemです。
categoriesプロパティで設定する項目がログ項目となるわけです。




ログを出力してみる

作成した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

作成されたログファイルは次の通り。

/logs/system.log
[2014-11-29 01:44:54.322] [INFO] system - this is system log!!!
logs/access.log
[2014-11-29 01:44:54.324] [INFO] access - this is access log!!!
error.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!!!');

実際に出力するとこんな感じになります。

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プロパティを設定できます。

log-config.json
{
    "appenders": [
        {
            "type":     "dateFile",
            "category": "system",
            "filename": "logs/system.log",
            "pattern":  "-yyyy-MM-dd"
        }
    ],
    "levels": {"system": "INFO"}  ココ
}

これで実行すると、category = "system"ののログがINFOレベル以上のログになります。

system.log
[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ログファイルにログを出力ません。
FATALFATAL以上のレベルのログを出力。
ERRORERROR以上のレベルのログを出力。
WARNWARN以上のレベルのログを出力。
INFOINFO以上のレベルのログを出力。
DEBUGDEBUG以上のレベルのログを出力。
TRACETRACE以上のレベルのログを出力。
ALL全てのログレベルの出力を行う

コンソールにログを出力する。

appendersに「type:console」で追記します。

log-config.json
{
    "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プロパティ追加

log-config.josn
{
    "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の時に機能するみたいです。

log-config.json
{
    "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 }));


+ Recent posts