ここのところ、仕事で node.js を使っているので、利用したライブラリなどを少しずつ紹介していきたいと思う。
winston は、ロギングライブラリで、非同期にログを書き出すことができる。
Sails.js は、このライブラリを利用してログをとっているし、このライブラリはnodejitsu社が、flatironというフレームワークのために開発したものということ。作りもしっかりしているのと、拡張もしやすかった。
インストールは以下のとおり。簡単。
npm install winston
最もシンプルな使い方としては以下のように、winston をそのまま使うやりかた
var winston = require('winston'); winston.silly('ばかばかしいこと'); winston.debug('かいはつのこと'); winston.verbose('どうでもいいこと'); winston.info('じょうほう'); winston.warn('やばい'); winston.error('すごくやばい');
実行すると以下の様な感じ
info: じょうほう
warn: やばい
error: すごくやばい
silly が定義してあるのは、npm のデフォルトのログレベルに準拠しているため。
ドキュメントみながら、そんなレベルあったっけな。と。
ファイルに出力したい場合は、これに transpoter を追加してやる必要がある。
var winston = require('winston'); winston.add(winston.transports.File, { filename: 'application.log' }); winston.silly('ばかばかしいこと'); winston.debug('かいはつのこと'); winston.verbose('どうでもいいこと'); winston.info('じょうほう'); winston.warn('やばい'); winston.error('すごくやばい');
{"level":"info","message":"じょうほう","timestamp":"2014-05-13T09:58:46.124Z"}
{"level":"warn","message":"やばい","timestamp":"2014-05-13T09:58:46.125Z"}
{"level":"error","message":"すごくやばい","timestamp":"2014-05-13T09:58:46.126Z"}
JSONで出力したくない場合は以下のようにする。
var winston = require('winston'); winston.add(winston.transports.File, { filename: 'application.log', json: false }); winston.silly('ばかばかしいこと'); winston.debug('かいはつのこと'); winston.verbose('どうでもいいこと'); winston.info('じょうほう'); winston.warn('やばい'); winston.error('すごくやばい');
2014-05-13T10:01:54.273Z - info: じょうほう
2014-05-13T10:01:54.274Z - warn: やばい
2014-05-13T10:01:54.275Z - error: すごくやばい
その他に、日付出さないようにする設定だとか、1ファイルあたりのサイズ・ファイルの上限などを
.add() の第2 引数を設定できたりする。
https://github.com/flatiron/winston/blob/master/docs/transports.md#file-transport
ただ、これだと、logger を別々にできないので以下のように別の
logger を定義することができたりする。
var logger = new (winston.Logger)({ transports: [ // 使う出力方法を transports で宣言する new (winston.transports.Console)({ level: 'silly', // level は silly 以上 colorize: true, // 色付き timestamp: true // 時間つき }) ] }); logger.silly('ばかばかしいこと'); logger.debug('とてもどうでもいいこと'); logger.verbose('どうでもいいこと'); logger.info('じょうほう'); logger.warn('やばい'); logger.error('すごくやばい');
なお、メールでの送信は、
https://github.com/flatiron/winston/blob/master/docs/transports.md#mail-transport
が、公式のドキュメントに書かれているが、メッセージを全件送ってしまうので
大量にエラーが発生した時なんかは、少し困ったことになる可能性がある。
そこで、他の人が作った winston-maller がおすすめで、
こちらは、一定期間に来るメールの量を制限することができる。
Sails.js (0.9.x) で transpoter を追加したい場合は、
config/log.js を以下のように変更すれば良い。
var config = { level: 'info', // default log level adapters: { Mail: { module: 'winston-mailer', to: 'udon@bucyou.net', from: 'udon@bucyou.net' } } };
adapters オブジェクト (なぜかドキュメントに書いていない) は、
キーに transporter オブジェクト名、module に require 時に必要な名前を指定できる。
https://github.com/machadogj/node-winston-mailer の場合は、
require('winston-mailer').Mail; winston.add(winston.transports.Mail, options);
の用に使えます、とあるので、1行目にある Mail をキー名として使えば良い。