Node.js + Express における log4js の 使い方

0 件のコメント

タイトルには「log4js」と記載していますが、実際は「log4js-node」の使い方です。 npmlog4js として登録されているのは、 GitHub の log4js-node なので、ここでも 「log4js-node」 を 「log4js」 として取り上げます。 インストール から 大まかな使い方 までが理解できる程度にまとめてみました。

インストール方法

まずは プロジェクト へ log4js をインストール する方法です。 npm が利用できる コンソール を起動して、プロジェクトルートディレクトリへ移動し、以下のコマンドを実行します。

1
npm install log4js --save

log4js の 基本的 な 使い方

基本と(思う)使い方の例を以下にサンプルコードで掲載します。

app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// log4js の読み込み
var log4js = require('log4js');
 
// ログ出力設定
log4js.configure({
  "appenders": [
    {
      "type": "file",
      "filename": "log/system.log",
      "maxLogSize": 20480,
      "backups": 3,
      "category": "system"
    },
    {
        "type": "console"
    }
  ],
  "levels": {
      "system": "ALL"
  }
});
 
// ロガーの生成
var logger = log4js.getLogger('system');
 
// ログ出力
logger.fatal('some fatal error message.');  // [2016-07-24 23:35:46.588] [FATAL] system - some fatal error message.
logger.error('some error message.');        // [2016-07-24 23:35:46.592] [ERROR] system - some error message.
logger.warn('some warning mesage.');        // [2016-07-24 23:35:46.592] [WARN] system - some warning mesage.
logger.info('some information message.');   // [2016-07-24 23:35:46.593] [INFO] system - some information message.
logger.debug('some debug message.');        // [2016-07-24 23:35:46.593] [DEBUG] system - some message.

log4js を利用する場合、まずは require() で モジュール を読み込みます。 読み込んだ後は logjs.configure() で 設定 を行います。 設定に従って logger インスタンス を生成し、このインスタンスメソッドを利用することでログ出力を行います。 基本的な流れは log4j や log4net と同じです。

log4js の 設定ファイル の 使い方

log4js.configure(object) に渡している オブジェクト を 任意の jsonファイル ( ここでは log4js.config.json ) に吐き出して 引数 を オブジェクト からフ ァイルパス へ変更するだけです。

ファイルパスを指定する際には、読み込み元ファイル( 以下のサンプルで app.js )から 設定ファイル( 以下のサンプルで log4js.config.json ) への 相対パス または 絶対パス で指定する点に注意してください。

log4js.config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
  "appenders": [
    {
      "type": "file",
      "filename": "log/system.log",
      "maxLogSize": 20480,
      "backups": 3,
      "category": "system"
    },
    {
        "type": "console"
    }
  ],
  "levels": {
      "system": "ALL"
  }
}

app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// log4js の読み込み
var log4js = require('log4js');
 
// ログ出力設定
log4js.configure('log4js.config.json');
 
// ロガーの生成
var logger = log4js.getLogger('system');
 
// ログ出力
logger.fatal('some fatal error message.');  // [2016-07-24 23:35:46.588] [FATAL] system - some fatal error message.
logger.error('some error message.');        // [2016-07-24 23:35:46.592] [ERROR] system - some error message.
logger.warn('some warning mesage.');        // [2016-07-24 23:35:46.592] [WARN] system - some warning mesage.
logger.info('some information message.');   // [2016-07-24 23:35:46.593] [INFO] system - some information message.
logger.debug('some debug message.');        // [2016-07-24 23:35:46.593] [DEBUG] system - some message.

Node.js + Express 環境 での 使い方

実際の利用を想定すると Node.js + Express 環境での利用になるかと思います。 Express の 標準ログ出力 を log4js に置き換える サンプルコード を以下に掲載します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var express = require('express');
var log4js = require('log4js');
 
// Express の Application インスタンスを生成
var app = express();
 
// log4js を準備
log4js.configure('./log4js.config.json');
var logger = log4js.getLogger('system');
 
// Express の 標準ログ出力を log4js に書き換え
app.use(log4js.connectLogger(logger, {level: 'auto'}));
 
// テンプレートエンジンを EJS に設定
app.set('views', './views');
app.set('view engine', 'ejs');
 
// 静的コンテンツの公開
app.use('/public', express.static('public'));
 
// GET: / の処理
app.use('/', require('./routes/index.js'));
 
// サーバー起動
app.listen(3000);
 
// 起動ログ
logger.info('Server running at http://localhost:3000');

Express の 標準ログ出力 を 書き換える場合、 L12 のように app.use() の引数に log4js.connectLogger() の戻り値を与えます。

なお、log4js.connectLogger() の 第2引数 に ログレベル auto を設定すると、以下のような出力になります。

条件 ログレベル
HTTPレスポンス が 3xx の場合 WARN
HTTPレスポンス が 4xx または 5xx の場合 ERROR
その他 INFO

Appender の 種類

Wikiを見る限り、以下の Appender が利用可能なようです。

  • Console
  • File
  • DateFile
  • DateFileSync
  • SMTP
  • Mailgun
  • hook.io
  • GELF
  • Multiprocess
  • Loggly
  • Clustered

ここでは特に使いそうな ConsoleFileDateFile の3種類を取り上げます。

Console

コンソールにログ出力を行うアペンダーです。

1
2
3
4
5
6
7
8
9
10
11
12
{
  "appenders": [
    {
      "type": "console",
      "layout": {
        "type": "pattern",
        "pattern": "[%r] [%[%5.5p%]] - %m%n"
      },
      "category": "console"
    }
  ]
}
type
console を指定します。
layout
ログ出力時のレイアウトを指定します。
category
カテゴリ名を指定します。

File

ファイルサイズでローリングを行うアペンダーです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "appenders": [
    {
      "type": "file",
      "filename": "cafeaulait.log",
      "maxLogSize": 1024,
      "backups": 3,
      "layout": {
        "type": "pattern",
        "pattern": "[%r] [%[%5.5p%]] - %m%n"
      },
      "category": "cafeaulait"
    }
  ]
}
type
file を指定します。
filename
出力するロのパスおよびグファイル名を指定します。
maxLogSize
ログファイルの最大サイズ(bytes)を指定します。
backups
ログファイルを保持する数を指定します。デフォルト 5。
layout
ログ出力時のレイアウトを指定します。
category
カテゴリ名を指定します。

DateFile

日付や時間で出力ファイルをローリングするアペンダーです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "appenders": [
    {
      "type": "dateFile",
      "filename": "cafelatte.log",
      "pattern": "-yyyy-MM-dd",
      "alwaysIncludePattern": false,
      "layout": {
        "type": "pattern",
        "pattern": "[%r] [%[%5.5p%]] - %m%n"
      },
      "category": "cafelatte"
    }
  ]
}
type
dateFile を指定します。
filename
基本ファイル名を指定します。
pattern
ファイル名の末尾に付与するパターンを指定します。
alwaysIncludePattern
日跨ぎ時に強制的にログローテートするかどうかを指定します。
layout
ログ出力時のレイアウトを指定します。
category
カテゴリ名を指定します。

Layout の 設定方法

各 Appender は layout を設定することで、出力フォーマットを制御することができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "appenders": [
    {
      "type": "console",
      "layout": {
        "type": "pattern",
        "pattern": "%[%r (%x{pid}) %p %c -%] %m%n",
        "tokens": {
          "pid": function() { return process.pid; }
        }
      }
    }
  ]
}
type
レイアウトの種類を指定します。
pattern
type: "pattern" の場合、ログ出力するパターンを定義します。
tokens
pattern 中で定義された「動的トークン」の実態を定義します。

type

type に指定できる値は以下の通りです。

  • messagePassThrough
  • basic
  • colored
  • pattern

おそらく普通に使うのは pattern になるかと思います。 type: "pattern" を指定すると、出力フォーマットを任意に変更することができます。

pattern 以外の出力例は以下の通りです。

type サンプル
messagePassThrough
some fatal error message.
some error message.
some warning mesage.
some information message.
some debug message.
basic
[2016-07-28 23:24:27.941] [FATAL] system - some fatal error message.
[2016-07-28 23:24:27.944] [ERROR] system - some error message.
[2016-07-28 23:24:27.946] [WARN] system - some warning mesage.
[2016-07-28 23:24:27.947] [INFO] system - some information message.
[2016-07-28 23:24:27.947] [DEBUG] system - some debug message.
colored
[2016-07-28 23:25:00.391] [FATAL] system - some fatal error message.
[2016-07-28 23:25:00.396] [ERROR] system - some error message.
[2016-07-28 23:25:00.397] [WARN] system - some warning mesage.
[2016-07-28 23:25:00.397] [INFO] system - some information message.
[2016-07-28 23:25:00.397] [DEBUG] system - some debug message.

pattern

pattern で利用可能な パターン は以下の通りです。

パターン 説明
%r toLocaleTimeStringで得られる「時刻」
%p 「ログレベル」
%c 「ログカテゴリ」
%h 「ホスト名」
%m 「ログデータ」
%d 「日付」。以下のパターンが利用可能です。
  • %d{ISO8601}
  • %d{ISO8601_WITH_TZ_OFFSET}
  • %d{ABSOLUTE}
  • %d{DATE}
%% 「%」
%n 「改行」
%z 「pid」
%x{<トークン>} 「動的トークン」を指定します。 動的トークンの内容は tokens パラメータで定義します。
%[%] カラーブロックの定義

tokens

pattern 中で指定された 動的トークン名 をキーとし、 関数 を バリュー とするハッシュオブジェクトを指定します。 指定した文字列を返す関数は、ログ出力時に呼び出されて、該当の処理結果を出力します。


参考記事

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!