Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

log4jsはjavascriptのログ出力モジュールです。

log4jsをインストールする

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

$ 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

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

/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 ログファイルにログを出力ません。
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"}
}

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

$ 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 }));
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away