情報アイランド

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

Node.js+winstonでログに実際に出力するメッセージやメタデータを作成する

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

  • log
  • npmlog
  • bunyan
  • winston
  • log4js

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

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

フィルタとリライタ

winstonモジュールでログに出力するメッセージやメタデータとして渡されたものから実際に出力するメッセージやメタデータを作成するにはwinston.Loggerクラスのコンストラクタの第1引数のオプションにfiltersオプションやrewritersオプションを指定します。

filtersオプションにはメッセージを作成するための1個以上の関数(フィルタ)を配列として指定します。

rewritersオプションにはメタデータを作成するための1個以上の関数(リライタ)を配列として指定します。

フィルタやリライタの第1引数はレベルであり、第2引数はメッセージであり、第3引数はメタデータです。

また、フィルタでは返り値としてログに実際に出力するメッセージを返すようにし、リライタではメタデータを返すようにします。

ただし、filtersオプションやrewritersオプションに2個以上のフィルタやリライタを指定した場合にはそれらのフィルタやリライタは順番に適用されます

var winston = require('winston');

var logger = new winston.Logger({
    rewriters: [
        function (level, msg, meta) {
            return 'xxx';
        }, 
        function (level, msg, meta) {
            return 'yyy';
        }
    ], 
    filters: [
        function (level, msg, meta) {
            return { foo: 'aaa', bar: 'bbb' }
        }, 
        function (level, msg, meta) {
            return { baz: 'ccc', qux: 'ddd' }
        }
    ]
});

なお、フィルタやリライタはlogger.filtersプロパティやlogger.rewritersプロパティに配列として格納されます。

var filters = logger.filters;
var rewriters = logger.rewriters;

サンプルコード1

winston-filters-rewriters.js

var winston = require('winston');

var logger = new winston.Logger({
    transports: [
        new winston.transports.Console({
            name: 'main'
        })
    ], 
    filters: [
        function(level, msg, meta) {
            return '** ' + msg;
        }, 
        function(level, msg, meta) {
            return msg + ' **';
        }
    ], 
    rewriters: [
        function(level, msg, meta) {
            meta.foon = '?? ' + meta.foo;
            return meta;
        }, 
        function(level, msg, meta) {
            meta.foon = meta.foon + ' ??';
            return meta;
        }, 
        function(level, msg, meta) {
            delete meta.foo;
            return meta;
        }
    ]
});

winston.info('this is message.', { foo: 'this is metadata.' });
logger.info('this is message.', { foo: 'this is metadata.' });

使用パッケージ

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

実行結果

C:\work\node>node winston-filters-rewriters.js
info: this is message. foo=this is metadata.
info: ** this is message. ** foon=?? this is metadata. ??

関連

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

-Node.js