node.jsのいろいろなモジュール2 – log.js
ログの出力
さて、今回はアプリケーションを開発する際に必ずと言っていいほど使用する機能、ログを出力するためのモジュールをご紹介します。 その名もズバリ、log.jsです。 このモジュールは非常にシンプルで、ログの出力とログファイルを読み込む機能を持っています。 さっそくインストールしてみましょう。 本記事での動作確認環境は下記の通りです。
- OS : MacOS X 10.6.8
- Node.js : v0.4.8
- npm : 1.0.14
まずはnpmを使用してモジュールをインストールします。
$ npm install log
githubにあるサンプルを記述して実行していきましょう。
//testLog.js var Log = require('log') , log = new Log(Log.INFO); log.debug('preparing email'); log.info('sending email'); log.error('failed to send email');
上記ファイルをtestLog.jsとして保存し、nodeコマンドを実行します。
$ node testLog.js
logモジュールをrequireしてログレベルをコンストラクタに渡してインスタンス化し、debugやらinfoやらのメソッドでコンソールに出力しています。 ここではログレベルをINFOに指定しているので、log.debugは出力されません。 例えばログレベルをERRORに指定した場合、log.criticalは出力されますが、log.warningは出力されません。 このログレベルはsyslogに模したものを使用しており、以下のレベルに分類されています。上のほうが重要度、緊急度が高いレベルです。
- 0 EMERGENCY システムクラッシュ等の緊急事態
- 1 ALERT 緊急に修正しなければならないエラー
- 2 CRITICAL 致命的エラー
- 3 ERROR 通常のエラー
- 4 WARNING 警告メッセージ
- 5 NOTICE エラーではない状態
- 6 INFO 情報メッセージ
- 7 DEBUG デバッグ時に使用するメッセージ
ファイルへ出力する
では今度は出力メッセージをファイルに出してみます。
//writeLog.js var Log = require('log') , fs = require('fs') , stream = fs.createWriteStream(__dirname + '/test.log') , log = new Log(Log.WARNING, stream); log.debug('a debug message'); log.info('a info message'); log.warning('a warning message'); log.error('a error message'); log.emergency('a emergency message');
Logのコンストラクタに書き込み用ストリームを渡しています。 上記ファイルをwriteLog.jsとして保存し、nodeコマンドを実行します。
$ node writeLog.js
すると、writeLog.jsファイルと同じディレクトリにtest.logファイルができています。 中を見ると、warning,error,emergencyのメッセージが出力されています。
ログファイルを読込む
最後に、test.logファイルとして出力されたログを読みこんでみましょう。 先ほどはコンストラクタに書き込み用ストリームを渡しましたが、今度はログファイルのパスを指定した読込み用ストリームを渡しています。
//readLog.js var Log = require('log') , fs = require('fs') , stream = fs.createReadStream(__dirname + '/test.log') , log = new Log(Log.DEBUG, stream); log.on('line', function(line){ //ログ内容1行分出力 console.log(line); //ログ1行の日付だけ出力 console.log(line.date); }).on('end', function(){ console.log('done'); });
上記ファイルをreadLog.jsとして保存し、nodeコマンドを実行します。
$ node readLog.js { date: Fri, 15 Jul 2011 23:53:13 GMT, level: 4, levelString: 'WARNING', msg: 'a warning message' } Fri, 15 Jul 2011 23:53:13 GMT { date: Fri, 15 Jul 2011 23:53:13 GMT, level: 3, levelString: 'ERROR', msg: 'a error message' } Fri, 15 Jul 2011 23:53:13 GMT { date: Fri, 15 Jul 2011 23:53:13 GMT, level: 0, levelString: 'EMERGENCY', msg: 'a emergency message' } Fri, 15 Jul 2011 23:53:13 GMT done
ログファイル内容が読み込まれていますね。 date,level,levelString,msgはプロパティとしてアクセスすることも出来ます。 ちなみに、LogコンストラクタにLog.ERRORやLog.EMERGENCYを指定しても出力は変わりませんでした。 現状はログファイルの中身すべてが対象のようです。
まとめ
どうでしたか?非常にシンプルですぐに使えそうですね。 例えば、これ以外にもlog4js-node ※1など、Log4Jに似た高機能なログライブラリも存在します。 それぞれ機能を確認し、必要に応じて採用を検討してみてください。 ではまた次回。
参考サイトなど
- ※1 log4js-node