winstonを使ってみる(node.jsでログを取る)

node.jsでログを取るときにwinstonを使ってみたのでそのメモ。

まずはnpmコマンドでインストール。

$ npm install winston --save

で、詳しくはGithub上のREADMEを参照するとかなり詳しくかかれているので、それを参照しながら実際にログを取ってみます。

やりたいこととしては、

  • ファイルと標準出力にログを出したい
  • ファイルに記録する際はJSONではなくタイムスタンプとログレベルとメッセージが並ぶ様にしたい
  • 標準出力に表示する際は色を付け、タイムスタンプも表示し、全てのログを記録したい
  • 標準出力に出すか否かは任意にしたい

という設定を仮定してみます。以下の様な形。

var winston = require('winston');

var getLoggerSettings = function(consoleLog) {
  var settings = {
    transports: [
      new winston.transports.File({ filename: "winston.log", json: false})
    ],
    exceptionHandlers: [
      new winston.transports.File({ filename: "winston.log", json: false})
    ]
  };

  if (consoleLog) {
    settings.transports.push(new winston.transports.Console({colorize: true, timestamp: true, level: 'silly'}));
    settings.exceptionHandlers.push(new winston.transports.Console({colorize: true, timestamp: true, level: 'silly'}));
  }

  return settings;
};

var logger = new (winston.Logger)(getLoggerSettings(true));
logger.silly('silly');
logger.debug('debug');
logger.verbose('verbose');
logger.info('info');
logger.warn('warn');
logger.error('error');

こうすることによって、ターミナル上には、

といった形でログが表示されます。また、ログファイル上にも、

2014-10-12T07:19:37.276Z - info: info
2014-10-12T07:19:37.276Z - warn: warn
2014-10-12T07:19:37.276Z - error: error

な形で記録されます。ファイル側にinfo以上のログしか記録されていないのは、new winston.transports.File({ filename: "winston.log", json: false}) としていてログレベルを明記していないので、標準のinfo以上のログが記録されています。

ここでは、標準出力とファイルログだけを対象にしましたが、winston-riakや、winston-mongodbという実装もあるので、ログをデータベースに記録することも容易そう*1

node.jsであれこれ書いてログを取りたいときはしばらく使ってみよう。

*1:見た感じですが...