今回は、Node.jsでカスタマイズ可能なログ(logger)を出力できるlog4js-nodeの使い方について学習していきましょう!
「効率よくログを出力したい」
「ログの出力をカスタマイズしたい」
「ログを別のファイルに書き出したい」
このような内容も含めて、本記事では以下のような構成で解説していきます!
【基礎】「log4js-node」の使い方
【実践】ログファイルの書き出し
【実践】設定ファイルの書き方
この記事で、Node.jsのログ(logger)をしっかり学習してスキルアップを目指していきましょう!
「logger」とは?
まずは今回のテーマでもあるログ(logger)についておさらいをしておきましょう。
ログ(logger)は、簡単に言うと「記録を取ること」であり、主にデバッグなどでエラーの原因を探るときによく使われます。
Node.jsはconsole.log()というメソッドが標準で使えるので、ログを出力することは簡単です。
ただし、今回紹介する「log4js-node」のモジュールを活用することで、効率よくカスタマイズ可能なログを出力することが可能になります。
Node.jsでサーバーを構築する際には特に便利なので、ぜひ本記事を参考にして使ってみてください!
「log4js-node」の使い方
この章では、「log4js-node」の基本的な使い方について見ていきましょう!
主に、導入手順からログの出力方法、ログレベルについて学んでいきます。
基本的な導入手順について
それでは「log4js-node」を導入するために、モジュールをインストールしていきましょう。
npmの「install」コマンドを使って次のように記述するだけで導入は完了です。
$ npm install log4js
あとは、Node.jsから利用できるようにrequire()を次のように記述します。
var log4js = require('log4js');
これで、Node.jsからlog4js-nodeを使えるようになりました。
簡単なログを出力してみる
それでは、実際にlog4js-nodeを使って簡単なログを出力してみましょう。
ログを出力するには「getLogger()」メソッドを次のように使います。
var logger = log4js.getLogger(); logger.debug("サンプル出力です");
この例のように、「debug()」の引数へ出力したいログを設定することで任意のログが出力されます。
ところが、このサンプル例を試すと実際には何も出力されません。
これはログレベルを設定していないことが理由です。
正しくは次のように記述します!
var logger = log4js.getLogger(); logger.level = 'all'; logger.debug("サンプル出力です");
実行結果
[2018-12-16T01:40:30.926] [DEBUG] default - サンプル出力です
この例では、「level」プロパティに「all」を設定していますね。
これはすべてのログレベルを許可するという意味になり、どんな種類のログも出力してくれるわけです。
ログレベル・種類については次の章で詳しく見ていきます。
ログレベルの使いわけ
log4js-nodeで利用できるログレベル・種類については以下の通りです。
・all
・trace
・debug
・info
・warn
・error
・fatal
・mark
・off
先ほどの例で利用した「all」を使うと、上記のログレベルをすべて出力できるわけです。
また、このレベル分けがあることで特定のログ以外は出力しないという設定も簡単になります。
実は、ログのレベルには次のような関係があるのです。
all < trace < debug < info < warn < error < fatal < mark < off
例えば、先ほど「all」に設定した箇所を「warn」に指定してみましょう!
var logger = log4js.getLogger(); logger.level = 'warn'; logger.trace("これはtraceです"); logger.debug("これはdebugです"); logger.warn("これはwarnです"); logger.error("これはerrorです");
実行結果
[2018-12-16T02:35:54.694] [WARN] default - これはwarnです [2018-12-16T02:19:42.704] [ERROR] default - これはerrorです
実行結果に注目してください。
levelプロパティで設定した「warn」以上のログだけが出力されていますよね。
つまり、warn < error < fatal < markの関係があるのでlevelプロパティに指定したレベル以上のログだけが出力されるというわけです。
このように重要なログだけを出力したり、特定のログ以外は無視するようなカスタマイズが簡単にできるので便利です。
設定ファイルの書き方
log4js-nodeの特徴として、設定ファイルを作成してカスタマイズが自由にできる点があげられます。
記述方法としては、「configure()」の引数に設定用のオブジェクトを渡してあげるだけです。
log4js.configure({ //ここにオブジェクトを設定する });
例えば、ログレベル「debug」と「error」2種類のログイベントを作成してみましょう!
これにはログの種類を決める「appenders」と2種類を区別するための「categories」プロパティを次のように設定します。
log4js.configure({ appenders: { out: { type: 'stdout' } }, categories: { default: { appenders: ['out'], level: 'debug' }, errLog: { appenders: ['out'], level: 'error' } } });
この例では、「appenders」にtypeが「stdout(標準出力)」と設定された「out」オブジェクトを作成しています。
この「out」オブジェクトを「categories」に作成した2種類のオブジェクトに適用させるわけです。
これで「default」「errLog」という2種類のログイベントが作れました。
それでは、いくつかのログを出力してみましょう。
var logger = log4js.getLogger(); logger.trace("これはtraceです"); logger.debug("これはdebugです"); logger.warn("これはwarnです"); logger.error("これはerrorです"); logger.fatal("これはfatalです");
実行結果
[2018-12-16T06:08:17.559] [DEBUG] e - これはdebugです [2018-12-16T06:08:17.569] [WARN] e - これはwarnです [2018-12-16T06:08:17.571] [ERROR] e - これはerrorです [2018-12-16T06:08:17.571] [FATAL] e - これはfatalです
この例では、引数なしでgetLogger()を実行していますね。
これはつまり先ほど作成した「default」のログイベントが実行されるという意味になります。
なので実行結果にはログレベルがdebug以上のものになっているわけです。
今度はgetLogger()の引数に「errLog」のログイベントを設定してみましょう。
var logger = log4js.getLogger('errLog'); logger.trace("これはtraceです"); logger.debug("これはdebugです"); logger.warn("これはwarnです"); logger.error("これはerrorです"); logger.fatal("これはfatalです");
実行結果
[2018-12-16T06:08:19.208] [ERROR] errLog - これはerrorです [2018-12-16T06:08:19.222] [FATAL] errLog - これはfatalです
実行結果に注目してください。
「errLog」のログイベントを作成した時に設定したレベルが「error」なので、実行結果もerror以上のログだけになっているわけです。
ログファイルの書き出し方法
設定ファイルをカスタマイズすることで、ログの出力結果を別のファイルに保存することも可能です。
先ほどはappendersのtypeを「stdout」に設定しましたが、今度は「file」に変更することでファイルに書き出すことが可能になります。
log4js.configure({ appenders: { logFile: { type: 'file', filename: 'error.log' } }, categories: { default: { appenders: [ 'logFile' ], level: 'error' } } });
この例では、appendersのtypeに「file」を設定してfilenameに「error.log」を指定しました。
それを「default」のログイベントに適用させたので、実行するとログがerror.logというファイル名で書き出されるわけです。
var logger = log4js.getLogger(); logger.trace("これはtraceです"); logger.debug("これはdebugです"); logger.warn("これはwarnです"); logger.error("これはerrorです");
この例では、ログの出力自体はされませんが新しく「error.log」というファイルが作られているはずです。
このファイルの中にテキストでログの出力が書き込まれているというわけです。
まとめ
今回は、Nodejsでログイベントをカスタマイズ可能なlog4js-nodeモジュールの使い方について学習しました。
最後に、もう一度ポイントをおさらいしておきましょう!
・ログレベルを設定することで特定のログイベントだけを出力させることができる
・configure()に設定用のオブジェクトを渡すことでカスタマイズができる
・ログの出力を別のファイルに書き出すことができる
上記内容を踏まえて、ぜひ自分でもプログラミングに取り入れて活用できるように頑張りましょう!