もやもやエンジニア

IT系のネタで思ったことや技術系のネタを備忘録的に綴っていきます。フロント率高め。

Node.js + Expressでロギングしてみる

最低、月1でなんか書こうという目標をすっかり忘れていました。

今回はNode.js + ExpressでWebアプリを作っているので、ログ周りの実装について書いてみます。

参考にしたのはこちら。
http://www.yoheim.net/blog.php?q=20130903

といっても調べようと思った事が、ほとんどこちらの記事に書かれていたので僕はこんな感じで作ってみましたという話になります。

さっくり要点だけ書くと

・Expressはロギング機能が貧弱かつデフォルトの設定がstdoutにログが出力するだけ。
・log4js(https://github.com/nomiddlename/log4js-node)というlog4jっぽいモジュールがnpmで用意されている。作成者様に感謝感謝。
・Expressでlog4jsを使えばいいじゃん

というわけで試してみた

基本的な使い方は以下の通りです。

var log4js = require('log4js');
var logger = log4js.getLogger({
  "appenders": [
    {
      "type": "file",
      "filename": "relative/path/to/log_file.log"
    }
  ]
});
logger.debug("Some debug messages");

log4jsモジュールを読み込んでloggerオブジェクトを作成してメソッドを呼ぶという感じです。

これをモジュール毎に書くのはしんどいので、logger用のモジュールを作りました。

logger.js

var log4js = require('log4js');
log4js.configure('config/log4js.json');

var loggerApp = log4js.getLogger('app'),
    loggerErr = log4js.getLogger('error'),
    loggerAcs = log4js.getLogger('access');

// expressに渡すアクセスログ設定
exports.accessConfig = log4js.connectLogger(loggerAcs, { level: log4js.levels.INFO });

// アプリケーションログ
exports.info = function(InStr){
  loggerApp.info(InStr);
};

// エラーログ(警告レベル)
exports.warn = function(InStr){
  loggerErr.warn(InStr);
};
// エラーログ(エラーレベル)
exports.error = function(InStr){
  loggerErr.error(InStr);
};
// エラーログ(緊急レベル)
exports.fatal = function(InStr){
  loggerErr.fatal(InStr);
};

config/log4js.json

{
  "appenders": [
    {
// アプリケーション用のログ
      "type": "dateFile",
      "filename": "log/app.log",
      "pattern": "-yyyy-MM-dd",
      "maxLogfSize":20480,
      "backups":10,
      "category":"app"
    },
    {
// アクセスログ
      "type": "dateFile",
      "filename": "log/access.log",
      "pattern": "-yyyy-MM-dd",
      "maxLogfSize":20480,
      "backups":10,
      "category":"access"
    },
    {
// エラーログ
      "type": "dateFile",
      "filename": "log/error.log",
      "pattern": "-yyyy-MM-dd",
      "maxLogfSize":20480,
      "backups":10,
      "category":"error"
    }
  ]
}

configではトレースログ、アクセスログ、エラーログを設定します。日単位でサイクルする設定です。

loggerモジュールではそれぞれのログのlog4js.loggerオブジェクトを作成して内部で保持し、ログ出力用の関数をレベル毎に作って、それぞれの関数の中でログの出力先を分けているという感じです。

使う時はこんな感じです。

app.js

// ロガー読み込み
var logger = require('logger');

// アプリケーション設定
app.configure(function(){
// Expressデフォルトのロガーはコメントアウト
//	app.use(express.logger('dev'));
// log4jsとexpressをつなげる
	app.use(logger.accessConfig);
// これでアクセスログがstdoutでなく指定したログファイルに出力されるようになります。
});


他のjs

var logger = require('logger');

try{
  // トレースログ出力
  logger.info('porc start');
  // 何か処理
}catch(e){
  // エラーログ出力
  logger.fatal(e);
}


いじょー。なんか間違ってたり上手いやり方があったら教えて下さい。