2020-04-13

【Node.js】log4js-nodeでログファイルを記録する【v6.1.2】

ログファイル出力するlog4jsを解説。更に設定(appendersとcategories)が非常に分かり難いため画像で解説する。

Article Image

なにこれ

Node.jsではログファイルを出力するとき恐らく一番よく使われているライブラリ。細かい設定が可能でログや標準出力以外にも様々な選択が可能。

詳しく解説しないがslack等にも直接送れるようだ。

バージョン6で何が変わった?

2019/11/06に5.3.0から6.0.0へアップデート。

特定のタイムゾーンを指定していた場合の日付フォーマットの変更があった。「fix」となっているが何か問題を修正し結果なのかどうかまでは調べていない。

日付のフォーマットが変更になったためlog4jsから出力された日付に別の処理を当てている場合プログラムの挙動がおかしくなる可能性があり、メジャーバージョンアップとなった。

余談:開発側のバージョンはこのようにしてメジャーアップデートするという勉強になる。npm updateが勝手にメジャーアップデートを行わない理由と、ncuで強制的に行った時たまにプログラムが動かなくなる理由はこういうところにあるのだろう。

インストール

npm install log4js

基本

import log4js from 'log4js'

const logger = log4js.getLogger() 
//logger.level = 'debug' 必要なら通知するレベルを限定する 後述
logger.trace("test")

// 出力結果
// [2020-04-13T14:53:38.561] [TRACE] default - test

getLogger()してレベルのメソッドで出力する。レベルは次で解説する。

レベル

レベルに指定できるのは次。下に行くほどレベルが高い

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

レベルはなんのためにあるか

  1. レベルによって表示色がかわる

  2. レベルに応じて記録するかしないかを分けることができる

    例: logger.level = 'debug' と設定しておくとdebug未満(つまりtrace)は出力されなくなる

設定(configure)

当然ながら出力先をファイルやconsole等に分けたいだろう。この設定が難しいので解説していく。

まずコード例

log4js.configureにオブジェクトを渡して設定を定義

//①
const logger_e = log4js.getLogger('e')
const logger_w = log4js.getLogger('w')
const logger_default = log4js.getLogger()

log4js.configure({
    appenders: { //②
        print: { type: 'stdout' },
        info_file: { type: 'file', filename: './logs/info.log' },
        warn_file: { type: 'file', filename: './logs/warn.log' },
        error_file: { type: 'file', filename: './logs/error.log' }
    },
    categories: {  //③
        default: { appenders: ['print'], level: 'all' },        
        w: { appenders: ['warn_file','print'], level: 'error' },
        e: { appenders: ['error_file','print'], level: 'error' },
    }
})

1. 変数名

自由な変数名 = getLogger('categorie名')

これで特定の変数名にカテゴリ1個分を紐付ける(後述)

2. appendersに出力先を書く

  • print: 画面に出力
  • info_file」「 warn_file」「 error_file」 : それぞれファイルに出力

3. categories(一番むずかしい箇所)

  • カテゴリ名を設定

    ここでは「default」「w」「e

  • levelを設定

    カテゴリに設定されたレベル「以上」のものだけ出力されると覚える

    例:errorを設定すれば、errorfatalのみ

  • 「出力先(appenders)」を複数選択。

  • getLogger() のように何も設定しなければ default になる

画像で解説

categoriesが一番難しいので画像で解説

概念図

この例だとappendersinfo_fileはどこからも指定されておらず機能しない。

それぞれのカテゴリは複数のappendersとつながっている

つまり1個のカテゴリに対して出力先を複数選択することができる。

それだけだ。それだけなのに意外に分かりにくい。

所感

殆どのサンプルはcategoriesdefaultに固定して使われているのでよほどのことがない限りこれでも詳しすぎる解説であると考える。

私のケースのようにファイルと画面表示を分けたい程度のユースケースは想像できるので少し踏み込んで解説した。

よく作り込まれたパッケージでまだまだ難しいことができそうだが今回はここまでとする。



この記事のタグ

この記事をシェア


謎の技術研究部 (謎技研)