LoginSignup
14
10

More than 5 years have passed since last update.

Node.jsでAPIのリクエストとレスポンスの内容をログに出力する

Posted at

意外と調べても出てこなかったので備忘録的なめも

やりたいこと

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"}}

出来たー
ただし、これが正しいやり方なのかは正直分からない...

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10