Node.jsではログファイルを出力するとき恐らく一番よく使われているライブラリ。細かい設定が可能でログや標準出力以外にも様々な選択が可能。
詳しく解説しないがslack等にも直接送れるようだ。
2019/11/06に5.3.0から6.0.0へアップデート。
特定のタイムゾーンを指定していた場合の日付フォーマットの変更があった。「fix」となっているが何か問題を修正し結果なのかどうかまでは調べていない。
日付のフォーマットが変更になったためlog4jsから出力された日付に別の処理を当てている場合プログラムの挙動がおかしくなる可能性があり、メジャーバージョンアップとなった。
余談:開発側のバージョンはこのようにしてメジャーアップデートするという勉強になる。npm updateが勝手にメジャーアップデートを行わない理由と、ncuで強制的に行った時たまにプログラムが動かなくなる理由はこういうところにあるのだろう。
npm install log4jsimport log4js from 'log4js'
const logger = log4js.getLogger() 
//logger.level = 'debug' 必要なら通知するレベルを限定する 後述
logger.trace("test")
// 出力結果
// [2020-04-13T14:53:38.561] [TRACE] default - testgetLogger()してレベルのメソッドで出力する。レベルは次で解説する。
レベルに指定できるのは次。下に行くほどレベルが高い。
レベルによって表示色がかわる
レベルに応じて記録するかしないかを分けることができる
例: logger.level = 'debug' と設定しておくとdebug未満(つまりtrace)は出力されなくなる
当然ながら出力先をファイルや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' },
    }
})自由な変数名 = getLogger('categorie名')
これで特定の変数名にカテゴリ1個分を紐付ける(後述)
print: 画面に出力info_file」「 warn_file」「 error_file」 : それぞれファイルに出力カテゴリ名を設定
ここでは「default」「w」「e」
levelを設定
カテゴリに設定されたレベル「以上」のものだけ出力されると覚える
例:errorを設定すれば、errorとfatalのみ
「出力先(appenders)」を複数選択。
getLogger() のように何も設定しなければ default になる
categoriesが一番難しいので画像で解説
この例だとappendersのinfo_fileはどこからも指定されておらず機能しない。
つまり1個のカテゴリに対して出力先を複数選択することができる。
それだけだ。それだけなのに意外に分かりにくい。
殆どのサンプルはcategoriesをdefaultに固定して使われているのでよほどのことがない限りこれでも詳しすぎる解説であると考える。
私のケースのようにファイルと画面表示を分けたい程度のユースケースは想像できるので少し踏み込んで解説した。
よく作り込まれたパッケージでまだまだ難しいことができそうだが今回はここまでとする。
