log4jsの覚え書き - log4.jsを使ってみた -



[log4js](https://www.npmjs.org/package/log4js)はjavascriptのログ出力モジュールです。

## log4jsをインストールする

```bash
$ npm install log4js
```

## ログ出力設定ファイルを作成する

```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になります。

```bash
$ 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は以下です。

```javascript
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のログ出力ができる。

```javascript
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  |ログファイルにログを出力ません。|
|FATAL|FATAL以上のレベルのログを出力。|
|ERROR|ERROR以上のレベルのログを出力。|
|WARN |WARN以上のレベルのログを出力。 |
|INFO |INFO以上のレベルのログを出力。 |
|DEBUG|DEBUG以上のレベルのログを出力。|
|TRACE|TRACE以上のレベルのログを出力。|
|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"}
}
```

実行するとこんな感じで出力されます。

```bash
$ 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プロパティ追加前**

```bash
[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秒毎にリロードします。

```javascript
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の設定時に次の内容を追記すれば良い様です。

```javascript
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 }));
```