情報アイランド

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

Node.js+BunyanでBunyanでログの出力先を設定する

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

  • log
  • npmlog
  • bunyan
  • winston
  • log4js

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

bunyanモジュールの基本的な使用方法に関しては下の記事を参照してください。

ログの出力先

bunyanモジュールでログの出力先を設定するにはbunyan.createLogger関数の第1引数のオプションにstreamsオプションを指定します。

streamsオプションには出力先を表すオブジェクトを配列として指定します。

var bunyan = require('bunyan');

var log = bunyan.createLogger({
    name: 'xxx', 
    streams: [{
        type: 'stream', 
        stream: writable, 
        name: 'aaa', 
        level: 'bbb', 
        reemitErrorEvents: false
    }, {
        type: 'raw', 
        stream: writable, 
        name: 'ccc', 
        level: 'ddd', 
        reemitErrorEvents: false
    }, {
        type: 'file', 
        path: 'eee', 
        name: 'fff', 
        level: 'ggg', 
        reemitErrorEvents: true
    }, {
        type: 'rotating-file', 
        path: 'hhh', 
        name: 'iii', 
        level: 'jjj', 
        reemitErrorEvents: false
    }]
});

出力先を表すオブジェクトには出力先の書き込みストリームの種類に応じて4つの種類があります。この種類はtypeプロパティに指定します。

  • stream・・・任意の書き込みストリームにログを出力します。streamプロパティに書き込みストリームを指定します。streamプロパティが指定されている場合にはtypeプロパティの値はstreamであると見做されます。
  • raw・・・オブジェクトを書き込む書き込みストリームにログを出力します。streamとほぼ同じですが、書き込みストリームに書き込まれるのは文字列(ログを表すオブジェクトが文字列化されたもの)ではなくログを表すオブジェクトそのものです。
  • file・・・ファイルにデータを書き込む書き込みストリームにログを出力します。pathプロパティにファイルのパスを指定します。pathプロパティが指定されている場合にはtypeプロパティの値はfileであると見做されます。
  • rotating-file・・・ファイルにデータを書き込み、古いデータをバックアップファイルに移動する書き込みストリームにログを出力します。pathプロパティにファイルのパスを指定し、periodプロパティにバックアップファイルにデータを移動する時期を指定し、countプロパティにバックアップファイルの個数を指定します。periodプロパティのデフォルトは1dであり、countプロパティのデフォルトは10です。periodには数値を下のような単位付きで指定します。バックアップファイルのパスはpathプロパティの値に.0.1、・・・を付加したものとなります。たとえば、periodプロパティに4hを指定し、countプロパティに5を指定した場合には4時間毎にファイルやバックアップファイルのデータがより古いバックアップファイルに移動されます。すなわち、pathプロパティのパスのファイルに保存されているデータはpathプロパティの値に.0を付加したパスのファイルに移動され、pathプロパティの値に.0を付加したパスのファイルに保存されているデータはpathプロパティの値に.1を付加したパスのファイルに移動され、・・・、pathプロパティの値に.3を付加したパスのファイルに保存されているデータはpathプロパティの値に.4を付加したパスのファイルに移動されます。
    • ms・・・ミリ秒です。
    • h・・・時間です。ただし、1hの代わりにhourlyを使用することもできます。
    • d・・・日です。ただし、1dの代わりにdailyを使用することもできます。
    • w・・・週です。ただし、1wの代わりにweeklyを使用することもできます。
    • m・・・月です。ただし、1mの代わりにmonthlyを使用することもできます。
    • y・・・年です。ただし、1yの代わりにyearlyを使用することもできます。

全ての種類の出力先を表すオブジェクトに共通のプロパティとしては下のようなものがあります。

  • name・・・名称を指定します。
  • level・・・レベルを指定します。このレベルより低いレベルのログはこの出力先には出力されなくなります。デフォルトはinfoです。
  • reemitErrorEvents・・・ロガーにおいてエラーイベントが発生するかを真偽値として指定します。書き込みストリームのエラーイベントがそのままロガーのエラーイベントとなります。デフォルトはtypeプロパティがfileである場合にはtrueであり、そうでない場合にはfalseです。

なお、ロガーの出力先のlevelプロパティを変更するにはlogger.levels関数を使用します。

logger.level('xxx', 'yyy');

第1引数に出力先の名称を指定します。

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

サンプルコード1

標準出力と現在のフォルダのlog.txtという名称のファイルにログを出力します。

bunyan-streams.js

var bunyan = require('bunyan');

var log = bunyan.createLogger({
    name: 'main', 
    streams: [{
        type: 'stream', 
        stream: process.stdout, 
        level: 'debug'
    }, {
        type: 'file', 
        path: 'log.txt', 
        level: 'error'
    }]
});

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

使用パッケージ

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

実行結果

コードを実行すると正しくログが出力されます。

C:\work\node>node bunyan-streams.js
{"name":"main","hostname":"mainnote","pid":5300,"level":60,"msg":"fatal","time":"2016-08-23T02:53:03.316Z","v":0}
{"name":"main","hostname":"mainnote","pid":5300,"level":50,"msg":"error","time":"2016-08-23T02:53:03.320Z","v":0}
{"name":"main","hostname":"mainnote","pid":5300,"level":40,"msg":"warn","time":"2016-08-23T02:53:03.321Z","v":0}
{"name":"main","hostname":"mainnote","pid":5300,"level":30,"msg":"info","time":"2016-08-23T02:53:03.322Z","v":0}
{"name":"main","hostname":"mainnote","pid":5300,"level":20,"msg":"debug","time":"2016-08-23T02:53:03.322Z","v":0}

また、正しくlog.txtにテキストデータが書き込まれていることが分かります。

C:\work\node>type log.txt
{"name":"main","hostname":"mainnote","pid":5300,"level":60,"msg":"fatal","time":"2016-08-23T02:53:03.316Z","v":0}
{"name":"main","hostname":"mainnote","pid":5300,"level":50,"msg":"error","time":"2016-08-23T02:53:03.320Z","v":0}

関連

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

-Node.js