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:見た感じですが...