読者です 読者をやめる 読者になる 読者になる

Express+MongoDBでのログ出力

Node.js入門で勉強中。Expressを使ったサンプルアプリを作っています。
そこで、express.logger()ミドルウェアの説明が乗っていたのですが、DB(MongoDB)に格納する事もできるらしいのでやってみた。
ちなみに性能検証はしてない。

バージョンとかはそれぞれ下記の通り

  • Node.js v0.8.16
  • Express 3.0.6
  • mongoose 3.5.4
  • MongoDB 2.0.6

ドキュメントの定義は以下のとおり

var LogSchema = new Schema({
  date:         { type: Number },
  method:       { type: String },
  statusCode:   { type: Number },
  url:          { type: String },
  querys:       { type: Object },
  referrer:     { type: String }
});
exports.LogModel = mongoose.model('Log', LogSchema);

ログを出力するときの処理
dbのところが今回の実装部分。ちなみになぜこの引数かというと、/node_modules/express/node_modules/connect/lib/middleware/logger.js にサンプルが書いてあったから。

exports.log = {
  stream : fs.createWriteStream('./log/access.log', { flags: 'a'}),
  db : function(tokens, req, res){
    var date        = new Date(tokens.date(req)).getTime()
      , method      = tokens.method(req)
      , statusCode  = tokens.status(req, res)
      , parsedUrl   = url.parse(req.url)
      , urlpath     = parsedUrl.pathname
      , querys      = querystring.parse(parsedUrl.query)
      , referrer    = tokens.referrer(req)
      ;
    var log = new Log({
      date:       date,
      method:     method,
      statusCode: statusCode,
      url:        urlpath,
      querys:     querys,
      referrer:   referrer
    });
    return log.save();
  }
};

app.jsでの埋め込み

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.favicon());
  app.use(express.logger(lib.log.db));
  // 省略

これでURLを叩くとDB内にはこんなかんじでデータが入ります。

> db.logs.find()
{ "date" : 1358613264000, "method" : "GET", "statusCode" : 304, "url" : "/topics", "querys" : { "hoge" : "1" }, "_id" : ObjectId("50facb101082614f0e000001"), "__v" : 0 }
{ "date" : 1358613264000, "method" : "GET", "statusCode" : 304, "url" : "/stylesheets/style.css", "referrer" : "http://localhost:3000/topics?hoge=1", "_id" : ObjectId("50facb101082614f0e000002"), "__v" : 0 }
{ "date" : 1358613306000, "method" : "GET", "statusCode" : 200, "url" : "/topics", "querys" : { "fuga" : "2", "hoge" : "1" }, "_id" : ObjectId("50facb3a1082614f0e000003"), "__v" : 0 }
{ "date" : 1358613319000, "method" : "GET", "statusCode" : 200, "url" : "/topics", "querys" : { "hoge" : [ "1", "2" ] }, "_id" : ObjectId("50facb471082614f0e000004"), "__v" : 0 }

サーバサイドJavaScript Node.js入門

サーバサイドJavaScript Node.js入門