意外と調べても出てこなかったので備忘録的なめも
やりたいこと
APIを実行した際にログとして
- 実行された時間
- API名
- Request Header
- Request Body
- Response Body
を出力したい
環境
ツール | バージョン |
---|---|
Node.js | v7.6.0 |
Express | 4.15.3 |
log4js | 1.1.1 |
実装
フォルダ構成
.
├── config
│ ├── default.yaml
│ └── development.yaml
├── app.js
└── lib
└── logger.js
log4jsを使ったログ出力機構について
res.endを利用してResponse Bodyを取得した後に
Request Header や Request Bodyと合わせてログに出力する。
※ express logging response body を参考
lib/logger.js
'use strict';
var log4js = require('log4js');
var config = require('config');
log4js.configure(config.log4js);
var logger = {
access: log4js.getLogger('access')
};
module.exports = function (req, res, next) {
var oldWrite = res.write,
oldEnd = res.end;
var chunks = [];
res.write = function (chunk) {
chunks.push(chunk);
oldWrite.apply(res, arguments);
};
res.end = function (chunk) {
if (chunk)
chunks.push(chunk);
var body = Buffer.concat(chunks).toString('utf8');
// ここで必要なログをくっつける
var logs = {
requestHeader: req.headers,
requestBody: req.body,
responseHeader: {},
// 取得したbodyはテキスト型であるため、一旦Json形式に変換しておく
responseBody: JSON.parse(body)
};
logger.access.info(req.method, req.path, JSON.stringify(logs));
oldEnd.apply(res, arguments);
};
next();
}
};
サーバプログラムの中で先ほど作成したログの出力処理をapp.useで読込させる。
app.js
'use strict';
// Express フレームワーク
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
// POSTでリクエストパラメータを取得するために必要
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.listen('3000', () => {
console.log('listen');
});
// リクエストやレスポンスの内容をログに出力するための設定
var logger = require('./lib/logger.js');
app.use(logger);
// パスが該当しなかったときの処理を記載
app.use(function(req, res, next){
res.send(404, {statusCode: 404, message: 'Not Found'});
});
module.exports = app;
実行
- NodejsのWebサーバを起動する
NODE_ENV=developmentn node app.js
- curlコマンドでAPIにアクセス
curl -H "Accept: application/json" -H "Content-type: application/json" -H "x-api-key: AAAAA" -X POST -d '{"endpoint":"xxx", "auth":"xxx", "key":"xxx","group":"xxx"}' http://localhost:3000/user/subscribe
- 出力結果
[2017-05-19 20:09:12.258] [INFO] access - POST /user/subscribe {"requestHeader":{"user-agent":"curl/7.37.0","host":"localhost:3000","accept":"application/json","content-type":"application/json","x-api-key":"AAAAA","content-length":"96"},"requestBody":{"endpoint":"xxx","auth":"xxx","key":"xxx","group":"xxx"}, "responseBody":{"statusCode":404,"message":"Not Found"}}
出来たー
ただし、これが正しいやり方なのかは正直分からない...