情報アイランド

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

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

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

  • log
  • npmlog
  • bunyan
  • winston
  • log4js

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

ログのレベル

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

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

  • error・・・問題が発生したことを示します。
  • warn・・・注意すべき事象が発生したことを示します。
  • info・・・情報であることを示します。
  • verbose・・・冗長な情報であることを示します。
  • silly・・・些末な情報であることを示します。

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

  • error・・・5000
  • warn・・・4000
  • info・・・2000
  • verbose・・・1000
  • silly・・・-Infinity

npmlogモジュールの場合、独自のレベルを追加することもできます。

独自のレベルを追加するにはnpmlog.addLevel関数を使用します。

var npmlog = require('npmlog');

npmlog.addLevel('xxx', 3000);

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

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

なお、デフォルトではinfoよりレベルが低いログは出力されません。

これを変更するにはnpmlog.levelプロパティにレベルの名称を設定します。設定したレベルより低いレベルのログは出力されなくなります。また、silentを指定すると全てのログが出力されなくなります。

npmlog.level = 'xxx';

ログの出力先

npmlogモジュールの場合、ログの出力先は任意の書き込みストリームです。デフォルトはprocess.stderrです。すなわち、標準エラー出力です。

ログの出力先を変更するにはnpmlog.streamプロパティに出力先の書き込みストリームを設定します。

npmlog.stream = writable;

ログの出力

ログを出力するにはnpmlog.log関数を使用します。

npmlog.log('xxx', 'yyy', 'zzz', 'aaa', 'bbb');

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

第2引数に接頭辞を指定します。接頭辞とは出力の際にメッセージの前に付加される文字列です。

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

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

あるいは、レベルに応じてレベルの名称と同じ名称の関数を使用することもできます。独自に追加したレベルに関してもレベルの名称と同じ名称の関数を使用することができます

npmlog.error('yyy', 'zzz', 'aaa', 'bbb');
npmlog.warn('yyy', 'zzz', 'aaa', 'bbb');
npmlog.info('yyy', 'zzz', 'aaa', 'bbb');
npmlog.verbose('yyy', 'zzz', 'aaa', 'bbb');
npmlog.silly('yyy', 'zzz', 'aaa', 'bbb');

第1引数に接頭辞を指定します。

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

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

なお、ログは内部的には下のようなプロパティを有するオブジェクトとして保持されます。

  • id・・・連番です。
  • level・・・レベルです。
  • prefix・・・接頭辞です。
  • message・・・メッセージです。
  • messageRaw・・・書式指定文字列に値が埋め込まれる前のメッセージと値の配列です。

ログの見出し

npmlogモジュールの場合、ログの見出しを設定することもできます。ログの見出しとはログの出力の際に冒頭に付加される文字列です。

ログの見出しを設定するにはnpmlog.headingプロパティを設定します。

npmlog.heading = 'xxx';

ログの出力の中断

ログの出力を中断するにはnpmlog.pause関数を使用します。

npmlog.pause();

なお、ログの出力を中断しても中断中のログが失われる訳ではありませんので注意してください。あくまでも出力が中断されるだけで、出力を再開した際に中断中に発生した全てのログが一挙に出力されることになります

ログの出力の再開

ログの出力を再開するにはnpmlog.resume関数を使用します。

npmlog.resume();

イベント

npmlogモジュールの場合、ログが出力された際にはlogイベントが発生します。

また、ログのレベルに応じてレベルの名称の冒頭にlog.を付加した名称のイベントも発生します。

また、ログの接頭辞の名称と同じ名称のイベントも発生します。

これらのイベントのイベントハンドラの第1引数はログを表すオブジェクトです。

ログの履歴

npmlogモジュールの場合、ログの履歴はnpmlog.recordプロパティに格納されます。

ただし、全てのログが保持される訳ではありません。npmlog.maxRecordSizeプロパティの値分より前のログは破棄されます。

サンプルコード1

npmlog.js

var npmlog = require('npmlog');
var fs = require('fs');

npmlog.heading = '**';

npmlog.error('', 'this is %s message.', 'error');
npmlog.warn('f', 'this is %s message.', 'warn');
npmlog.info('b', 'this is %s message.', 'info');
npmlog.verbose('ba', 'this is %s message.', 'verbose');
npmlog.silly('q', 'this is %s message.', 'silly');

npmlog.level = 'silly';

npmlog.error('', 'this is %s message.', 'error');
npmlog.warn('f', 'this is %s message.', 'warn');
npmlog.info('b', 'this is %s message.', 'info');
npmlog.verbose('ba', 'this is %s message.', 'verbose');
npmlog.silly('q', 'this is %s message.', 'silly');

npmlog.addLevel('my', 3000);

npmlog.my('m', 'this is %s message.', 'my');
npmlog.log('my', 'm', 'this is also %s message.', 'my');

npmlog.stream = fs.createWriteStream('log.txt', 'utf-8');

npmlog.error('', 'this is %s message filed.', 'error');
npmlog.warn('f', 'this is %s message filed.', 'warning');
npmlog.info('b', 'this is %s message filed.', 'info');
npmlog.verbose('ba', 'this is %s message filed.', 'verbose');
npmlog.silly('q', 'this is %s message filed.', 'silly');

console.log(npmlog.maxRecordSize);
console.log(npmlog.record);

使用パッケージ

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

実行結果

C:\work\node>node npmlog.js
** ERR! this is error message.
** WARN f this is warn message.
** info b this is info message.
** ERR! this is error message.
** WARN f this is warn message.
** info b this is info message.
** verb ba this is verbose message.
** sill q this is silly message.
** my m this is my message.
** my m this is also my message.
10000
[ { id: 0,
    level: 'error',
    prefix: '',
    message: 'this is error message.',
    messageRaw: [ 'this is %s message.', 'error' ] },
  { id: 1,
    level: 'warn',
    prefix: 'f',
    message: 'this is warn message.',
    messageRaw: [ 'this is %s message.', 'warn' ] },
  { id: 2,
    level: 'info',
    prefix: 'b',
    message: 'this is info message.',
    messageRaw: [ 'this is %s message.', 'info' ] },
  { id: 3,
    level: 'verbose',
    prefix: 'ba',
    message: 'this is verbose message.',
    messageRaw: [ 'this is %s message.', 'verbose' ] },
  { id: 4,
    level: 'silly',
    prefix: 'q',
    message: 'this is silly message.',
    messageRaw: [ 'this is %s message.', 'silly' ] },
  { id: 5,
    level: 'error',
    prefix: '',
    message: 'this is error message.',
    messageRaw: [ 'this is %s message.', 'error' ] },
  { id: 6,
    level: 'warn',
    prefix: 'f',
    message: 'this is warn message.',
    messageRaw: [ 'this is %s message.', 'warn' ] },
  { id: 7,
    level: 'info',
    prefix: 'b',
    message: 'this is info message.',
    messageRaw: [ 'this is %s message.', 'info' ] },
  { id: 8,
    level: 'verbose',
    prefix: 'ba',
    message: 'this is verbose message.',
    messageRaw: [ 'this is %s message.', 'verbose' ] },
  { id: 9,
    level: 'silly',
    prefix: 'q',
    message: 'this is silly message.',
    messageRaw: [ 'this is %s message.', 'silly' ] },
  { id: 10,
    level: 'my',
    prefix: 'm',
    message: 'this is my message.',
    messageRaw: [ 'this is %s message.', 'my' ] },
  { id: 11,
    level: 'my',
    prefix: 'm',
    message: 'this is also my message.',
    messageRaw: [ 'this is also %s message.', 'my' ] },
  { id: 12,
    level: 'error',
    prefix: '',
    message: 'this is error message filed.',
    messageRaw: [ 'this is %s message filed.', 'error' ] },
  { id: 13,
    level: 'warn',
    prefix: 'f',
    message: 'this is warning message filed.',
    messageRaw: [ 'this is %s message filed.', 'warning' ] },
  { id: 14,
    level: 'info',
    prefix: 'b',
    message: 'this is info message filed.',
    messageRaw: [ 'this is %s message filed.', 'info' ] },
  { id: 15,
    level: 'verbose',
    prefix: 'ba',
    message: 'this is verbose message filed.',
    messageRaw: [ 'this is %s message filed.', 'verbose' ] },
  { id: 16,
    level: 'silly',
    prefix: 'q',
    message: 'this is silly message filed.',
    messageRaw: [ 'this is %s message filed.', 'silly' ] } ]

C:\work\node>type log.txt
** ERR! this is error message filed.
** WARN f this is warning message filed.
** info b this is info message filed.
** verb ba this is verbose message filed.
** sill q this is silly message filed.

関連

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

-Node.js