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 }
- 作者: 清水俊博,大津繁樹,Jxck,小林秀和,佐々木庸平,篠崎祐輔,高木敦也,西山雄也
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2012/10/26
- メディア: 大型本
- 購入: 31人 クリック: 803回
- この商品を含むブログ (7件) を見る