2012年10月9日

【Node.js】expressでaccess log + log rotate


expressを使ってサービスを開始する場合、
デフォルトのログではユーザの細かな情報までは得られないので、
app.jsを編集して、apacheのようなアクセスログにしてみました。


// app.js
  app.use(express.favicon());
// remove default logging
// app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  // write access log
  app.use(function(req, res, next) {
    console.log([
      req.headers['x-forwarded-for'] || req.client.remoteAddress,
      new Date().toLocaleString(),
      req.method,
      req.url,
      res.statusCode,
      req.headers.referer || '-',
      req.headers['user-agent'] || '-'
      ].join('\t')
    );
    next();
  });
  app.use(app.router);
// continue ...

ってな感じで、app.routerの前にfunctionを突っ込んで、欲しい情報を抜き出します。
その配列をtab区切りで1つの文字列にしてconsole.logで書き込んでいます。

次に、ログローテート用にスクリプトを書きました。
#!/bin/bash
forever stop /var/www/public_html/app.js
DATE=`date +%Y%m%d`
mv -f /var/www/public_html/log/access.log /var/www/public_html/log/old/access-${DATE}.log
forever start -a -l /var/www/public_html/log/access.log /var/www/public_html/app.js
gzip -f /var/www/public_html/log/old/*.log

基本、ストップ・スタートをしているだけですが、
ログ・ファイルの場所を異動させてgzipしています。

こんな感じでサービス運用しています。

でも、これだと一瞬サービス止まるんですよね。
動かしつつも、ログローテートはこちらを参照。