自前でこったことをするわけでなければ log4js-node と node-config で。
fluentd にログを送りつけたい場合は fluent-logger-node を使う。
log4js を使ってログをはきつつ、環境ごとの設定を node-config できりわける。 node-config は <environment>.json という名前で環境ごとに設定を書けるみたい。開発用と本番用でログまわりの設定を変えてみる。
基本的に以下の 3 つのログをとることにするよ。
- アプリのシステムログ
- アクセスログ
- エラーログ
開発用ではすべてのレベルのログをコンソールにたれながす。
config/development.json
{
"log4js": {
"level": "ALL",
"configure": {
"appenders": [
{
"category": "system",
"type": "console"
},
{
"category": "access",
"type": "console"
},
{
"category": "error",
"type": "console"
}
],
"replaceConsole": true
}
}
}
本番用では info 以上のログだけをファイルに記録、 fluentd 経由でログサーバーに送る。
config/production.json
{
"log4js": {
"level": "INFO",
"configure": {
"appenders": [
{
"category": "system",
"type": "file",
"filename": "logs/system.log"
},
{
"category": "access",
"type": "file",
"filename": "logs/access.log"
},
{
"category": "error",
"type": "file",
"filename": "logs/error.log"
}
],
"replaceConsole": true
}
},
"fluentd": {
"host": "192.168.50.120",
"port": 24224,
"timeout": 3.0
}
}
で、こういう風に初期化する。モジュール化するのがいいかも。
logger.js
var config = require('config');
var log4js = require('log4js');
log4js.configure(config.log4js.configure);
if (process.env.NODE_ENV === 'production') {
var appender = require('fluent-logger').support.log4jsAppender('node', {
host: config.fluentd.host,
port: config.fluentd.port,
timeout: config.fluentd.timeout
});
log4js.addAppender(appender);
}
var logger = {
system: log4js.getLogger('system'),
access: log4js.getLogger('access'),
error: log4js.getLogger('error')
}
for (key in logger) {
logger[key].setLevel(config.log4js.level);
}
使うときはこんなかんじで。
logger.access.info({
httpVersion: 1.1,
httpMethod: 'GET',
url: '/'
});