node.jsのいろいろなモジュール2 – log.js

2011.07.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ログの出力

さて、今回はアプリケーションを開発する際に必ずと言っていいほど使用する機能、ログを出力するためのモジュールをご紹介します。 その名もズバリ、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に似た高機能なログライブラリも存在します。 それぞれ機能を確認し、必要に応じて採用を検討してみてください。 ではまた次回。

参考サイトなど