情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでBunyanを使ってログを出力する

ログを出力するには下のようなモジュールを利用する方法があります。

  • log
  • npmlog
  • bunyan
  • winston
  • log4js

この記事ではbunyanモジュールを利用する方法を取り上げます。

ログのレベル

一般的に、ログにはレベルという属性があり、ログの重要さを表します。

bunyanモジュールの場合、重要さが最も高いものから順に下のようなレベルがあります。

  • fatal・・・アプリケーション全体に影響を及ぼす致命的な問題が発生したことを示します。このような場合、通常、アプリケーションは動作を停止します。
  • error・・・アプリケーションの何らかの処理において問題が発生したことを示します。このような場合、通常、問題が発生した処理の実行は中断されますが、アプリケーション全体の動作が停止することはなく、他の処理の実行は続行されます。
  • warn・・・アプリケーションの何らかの処理において注意すべき事象が発生したことを示します。このような場合、通常、事象が発生した処理の実行は続行されます。
  • info・・・情報であることを示します。
  • debug・・・デバッグ用の情報であることを示します。
  • trace・・・アプリケーションが使用しているライブラリからの情報であるか、アプリケーションの非常に詳細な情報であることを示します。

レベルは内部的には下のような数値で表されています。

  • fatal・・・60
  • error・・・50
  • warn・・・40
  • info・・・30
  • debug・・・20
  • trace・・・10

この数値はレベルに応じてbunyan.FATALプロパティなどに格納されています。

var bunyan = require('bunyan');

var fatal = bunyan.FATAL;
var error = bunyan.ERROR;
var warn = bunyan.WARN;
var info = bunyan.INFO;
var debug = bunyan.DEBUG;
var trace = bunyan.TRACE;

ロガーの作成

bunyanモジュールの場合、ログを出力するにはまずロガーを作成しなければなりません。

ロガーを作成するにはbunyan.createLogger関数を使用します。

var logger = bunyan.createLogger({
    name: 'xxx', 
    level: 'yyy'
});

第1引数にオプションをオブジェクトとして指定します。

必ず指定しなければならないオプションには下のようなものがあります。

  • name・・・名称を指定します。

その他のオプションには下のようなものがあります。

  • level・・・レベルを指定します。このレベルより低いレベルのログはこのロガーでは出力されなくなります。デフォルトはinfoです。

返り値としてロガーが得られます。

以後ロガーをloggerと表記します。

ロガーの変更

ロガーのlevelオプションを変更するにはlogger.level関数を使用します。

logger.level('xxx');

第1引数にレベルを指定します。

ログの出力

ログを出力するにはレベルに応じてレベルの名称と同じ名称のロガーの関数を使用します。

logger.fatal({ foo: 'ccc', bar: 'ddd' }, 'yyy', 'aaa', 'bbb');
logger.error({ foo: 'ccc', bar: 'ddd' }, 'yyy', 'aaa', 'bbb');
logger.warn({ foo: 'ccc', bar: 'ddd' }, 'yyy', 'aaa', 'bbb');
logger.info({ foo: 'ccc', bar: 'ddd' }, 'yyy', 'aaa', 'bbb');
logger.debug({ foo: 'ccc', bar: 'ddd' }, 'yyy', 'aaa', 'bbb');
logger.trace({ foo: 'ccc', bar: 'ddd' }, 'yyy', 'aaa', 'bbb');

第1引数にメタデータをオブジェクトとして指定します。この引数は指定しなくても構いません。

このオブジェクトはログを表すオブジェクトに統合されます。

ログの出力時にbunyanモジュールが自動的にログを表すオブジェクトに付加するプロパティと同じ名称のメタデータを指定した場合にはメタデータの方がログに出力されます。ただし、msgプロパティとvプロパティを除きます。

第2引数にメッセージを指定します。このメッセージには書式指定文字列(%s%d%jなど)を含めることもできます。

メッセージはログを表すオブジェクトにmsgプロパティとして含められます。

第3引数以降に第2引数のメッセージの書式指定文字列に順番に埋め込む値を指定します。この引数は指定しなくても構いません。

ただし、第1引数にはメタデータの代わりにエラーオブジェクトを指定することもできます。

エラーオブジェクトはログを表すオブジェクトにerrプロパティとして含められます。

また、第1引数にエラーオブジェクトを指定した場合には第2引数のメッセージは指定しなくても構いません。第2引数のメッセージを指定しなかった場合には代わりにエラーオブジェクトのメッセージがログを表すオブジェクトにmsgプロパティとして含められます。

なお、メタデータとエラーオブジェクトの両方を第1引数に指定したい場合にはエラーオブジェクトをメタデータの一部として指定するようにします。すなわち、メタデータのerrプロパティにエラーオブジェクトを指定します。

bunyanモジュールの場合、ログの出力先は1個以上の任意の書き込みストリームです。デフォルトはprocess.stdoutです。すなわち、標準出力です。また、デフォルトではログは文字列(ログを表すオブジェクトが文字列化されたもの)として出力されます。

また、bunyanモジュールのログの形式には固有のバージョンが割り振られます(現在は0しかありません)。

ログの形式のバージョンはbunyan.LOG_VERSIONプロパティに格納されています。

var v = bunyan.LOG_VERSION;

ログを表すオブジェクト

ログを表すオブジェクトは下のようなプロパティを有します。

  • v・・・ログの形式のバージョンです。
  • level・・・レベルです。
  • name・・・ロガーの名称です。
  • hostname・・・コンピュータ名です。
  • pid・・・プロセスのIDです。
  • time・・・日時です。
  • msg・・・メッセージです。
  • src・・・プログラムにおいてログの出力を指示した場所です。
  • err・・・エラーオブジェクトです。

サンプルコード1

bunyan-create-logger.js

var bunyan = require('bunyan');

console.log(bunyan.FATAL);
console.log(bunyan.ERROR);
console.log(bunyan.WARN);
console.log(bunyan.INFO);
console.log(bunyan.DEBUG);
console.log(bunyan.TRACE);

console.log(bunyan.LOG_VERSION);

var logger = bunyan.createLogger({
    name: 'main', 
    level: 'debug'
});

logger.fatal('fatal');
logger.error('error');
logger.warn('warn');
logger.info('info');
logger.debug('debug');
logger.trace('trace');

logger.fatal('this is a %s log.', 'fatal');
logger.fatal({ foo: 100 }, 'this is also a %s log.', 'fatal');
logger.fatal({ foo: 100, hostname: '', msg: '', v: '' }, 'this is also a %s log.', 'fatal');
logger.fatal(new Error('error'));
logger.fatal(new Error('error'), 'this is a %s %s log.', 'fatal', 'error');

使用パッケージ

  • Bunyan
    npm install bunyanでインストールします。

実行結果

C:\work\node>node bunyan-create-logger.js
60
50
40
30
20
10
0
{"name":"main","hostname":"mainnote","pid":5208,"level":60,"msg":"fatal","time":"2016-08-21T00:51:20.615Z","v":0}
{"name":"main","hostname":"mainnote","pid":5208,"level":50,"msg":"error","time":"2016-08-21T00:51:20.615Z","v":0}
{"name":"main","hostname":"mainnote","pid":5208,"level":40,"msg":"warn","time":"2016-08-21T00:51:20.615Z","v":0}
{"name":"main","hostname":"mainnote","pid":5208,"level":30,"msg":"info","time":"2016-08-21T00:51:20.615Z","v":0}
{"name":"main","hostname":"mainnote","pid":5208,"level":20,"msg":"debug","time":"2016-08-21T00:51:20.630Z","v":0}
{"name":"main","hostname":"mainnote","pid":5208,"level":60,"msg":"this is a fatal log.","time":"2016-08-21T00:51:20.630Z","v":0}
{"name":"main","hostname":"mainnote","pid":5208,"level":60,"foo":100,"msg":"this is also a fatal log.","time":"2016-08-21T00:51:20.630Z","v":0}
{"name":"main","hostname":"","pid":5208,"level":60,"foo":100,"msg":"this is also a fatal log.","v":0,"time":"2016-08-21T00:51:20.630Z"}
{"name":"main","hostname":"mainnote","pid":5208,"level":60,"err":{"message":"error","name":"Error","stack":"Error: error\n    at Object.<anonymous> (C:\\work\\node\\bunyan-create-logger.js:27:11)\n    at Module._compile (module.js:541:32)\n    at Object.Module._extensions..js (module.js:550:10)\n    at Module.load (module.js:458:32)\n    at tryModuleLoad (module.js:417:12)\n    at Function.Module._load (module.js:409:3)\n    at Function.Module.runMain (module.js:575:10)\n    at startup (node.js:160:18)\n    at node.js:449:3"},"msg":"error","time":"2016-08-21T00:51:20.649Z","v":0}
{"name":"main","hostname":"mainnote","pid":5208,"level":60,"err":{"message":"error","name":"Error","stack":"Error: error\n    at Object.<anonymous> (C:\\work\\node\\bunyan-create-logger.js:28:11)\n    at Module._compile (module.js:541:32)\n    at Object.Module._extensions..js (module.js:550:10)\n    at Module.load (module.js:458:32)\n    at tryModuleLoad (module.js:417:12)\n    at Function.Module._load (module.js:409:3)\n    at Function.Module.runMain (module.js:575:10)\n    at startup (node.js:160:18)\n    at node.js:449:3"},"msg":"this is a fatal error log.","time":"2016-08-21T00:51:20.652Z","v":0}

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js