iMind Developers Blog

iMind開発者ブログ

log4jsによるログ出力

概要

log4jsを使ってログ出力、フォーマットの変更、ファイル出力、ログローテーション等を行う。

バージョン情報

  • node v10.15.1
  • log4js@5.1.0

インストール

$ npm i log4js

コンソールへのログ出力

ログレベルをinfoに設定してログを出力してみる。

const log4js = require('log4js')
const logger = log4js.getLogger();
logger.level = 'info';

logger.debug('debug');
logger.info('info');
logger.warn('warn');
logger.error('error');

出力結果

f:id:imind:20190927212111p:plain

ログレベル

ログレベルには下記が指定できる。

  • all
  • trace
  • debug
  • info
  • warn
  • error
  • fatal
  • off

allだとすべて表示、offだとfatalであれなんであれすべて表示しなくなる。

出力ログのフォーマットを指定する

参考ページ : https://github.com/log4js-node/log4js-node/blob/master/docs/layouts.md

const log4js = require('log4js')
log4js.configure({
  appenders: {
    out: { type: 'stdout', layout: {
      type: 'pattern',
      pattern: '%d{yyyy-MM-dd hh:mm:ss} %p %c %m'
    }}
  },
  categories: { default: { appenders: ['out'], level: 'info' } }
});
const logger = log4js.getLogger();

logger.debug('debug');
logger.info('info');
logger.warn('warn');
logger.error('error');
logger.fatal('fatal');

実行結果

2019-09-27 18:48:17 INFO default info
2019-09-27 18:48:17 WARN default warn
2019-09-27 18:48:17 ERROR default error
2019-09-27 18:48:17 FATAL default fatal

よく使いそうな項目

パターン 意味
%d{yyyy-MM-dd hh:mm:ss} 日時 2019-09-27 18:48:17
%r 時間 18:48:17
%p ログレベル INFO
%c ログカテゴリ default
%h ホスト名
%m ログメッセージ
%n 改行
%p プロセスID
%f ファイル名(enableCallStack: true指定時) /home/user/filename.js
%f{n} ファイル名(n階層) filename.js
%l 行番号 10
%[ ... %] 囲まれた区間がカラーブロックになる

ファイル名、行番号、日時、ログレベル、メッセージが表示される例。

pattern: '%[%f{1}:%l  %d{yyyy-MM-dd} %r %p %m %]'

f:id:imind:20190927212131p:plain

configをjsonで記述する

適当なファイル名でjsonファイルを作る。(仮にlog4js_example.jsonとする)

{
  "appenders": {
    "out": { 
      "type": "stdout",
      "layout": {
        "type": "pattern",
        "pattern": "%d{yyyy-MM-dd hh:mm:ss} %p %c %m"
    }}
  },
  "categories": {
    "default": {
      "appenders": ["out"],
      "level": "info" 
    } 
  }
}

jsonファイルを読み込んでログ出力。

const log4js = require('log4js')
log4js.configure('log4js_example.json');
const logger = log4js.getLogger();

logger.info('info');

ファイル出力

ログをファイル出力する場合は、typeをfileにし、filenameを記述する。

log4js.configure({
  appenders: {
    out: { type: 'file', filename: 'logs/foo.log', layout: {
      type: 'pattern',
      pattern: '%f{1}:%l  %d{yyyy-MM-dd} %r %p %m'
    }}
  },
  categories: { default: { appenders: ['out'], level: 'info', enableCallStack: true } }
});

これで指定したfilenameのパスにログが出力される。

ファイルのローテート

typeにdateFileを指定し、patternに日付フォーマットを入れるとファイルのローテートができる。

下記は動きが確認しやすいように1分ごとにローテートする処理を入れている。

log4js.configure({
  appenders: {
    out: { 
      type: 'dateFile', 
      filename: 'logs/foo.log', 
      pattern: '-yyyy-MM-ddThh-mm', 
      layout: {
        type: 'pattern',
        pattern: '%f{1}:%l  %d{yyyy-MM-dd} %r %p %m'
      }
    }
  },
  categories: { default:  { appenders: ['out'], level: 'info', enableCallStack: true } }
});

これを時間を置きながら叩くと下記のように日時が付加されたファイル名でログファイルが生成されている。

foo.log
foo.log.-2019-09-27T19-37
foo.log.-2019-09-27T19-38 
foo.log.-2019-09-27T19-41

info以上をconsoleに、warn以上をファイルに出力する

info以上はconsoleに出力し、warn以上であればファイルにも出力する設定。

file向けのappendersに指定した後、logLevelFilterというtypeでログレベルのフィルタを設定している。

これを実行するとコンソールにはinfo以降が、ログファイルにはwarn以降が出力される。

log4js.configure({
  appenders: {
    stdout: {
      type: 'console',
      layout: {
        type: 'pattern',
        pattern: '%[%f{1}:%l  %d{yyyy-MM-dd} %r %p %m %]'
      }
    },
    file: {
      type: 'dateFile',
      filename: 'logs/foo.log',
      pattern: '-yyyy-MM-dd',
      layout: {
        type: 'pattern',
        pattern: '%f{1}:%l  %d{yyyy-MM-dd} %r %p %m'
      },
    },
    warn_file: {
      type: 'logLevelFilter',
      appender: 'file',
      level: 'warn'
    }
  },
  categories: {
    default: {
      appenders: ['stdout', 'warn_file'],
      level: 'info',
      enableCallStack: true
    }
  }
});

改定履歴

Author: Masato Watanabe, Date: 2019-10-03, 記事投稿