zone.jsを使用してアクセス毎にユニークな識別子をログへ出力する
expressではアクセス毎にリクエストIDを発行する機能はなく、自前で用意する必要があります。
そこで、Nginx or UUIDv4を使用してリクエストID毎にユニークな識別子を用意します。
リクエスト毎に値を保持する必要があるので、zone.jsを使用し持ち回れるようにしておきます。
nginxでrequest_id
uuid
zone.jsについて
logger.js
'use strict';
require('zone.js');
const uuidv4 = require('uuid/v4');
const moment = require('moment');
exports.middleware = function(req, res, next) {
const prop = {
name: 'requestId',
properties: {
requestId: req.header('x-request-id') || uuidv4()
}
};
Zone
.current
.fork(prop)
.run(next);
};
exports.out = function(text) {
const reqId = Zone.current.get('requestId');
console.log(`[${moment().format("YYYY-MM-DD HH:mm:ss.SS")}(${reqId})] ${text}`);
};
app.js
const logger = require('./middleware/logger');
app.use(logger.middleware);
index.js
var express = require('express');
var router = express.Router();
const logger = require('../middleware/logger');
router.get('/', function(req, res, next) {
logger.out(`リクエスト受信 params => 【${req.query.example}】`);
// 確認用に遅れてレスポンスを返す
setTimeout(function () {
logger.out(`レスポンス送信 params => 【${req.query.example}】`);
res.json({test: 'Hello'});
}, Math.floor(Math.random() * 1000));
});
module.exports = router;
確認
UUIDをリクエストパラメータにつけて複数アクセスをしてログを確認してみる。
[2019-12-09 23:34:05.76(8355c676546235af1cac5d31989d5e5a)] リクエスト受信 params => 【d951a794-11cd-45c8-966f-07f20594de2f】
[2019-12-09 23:34:05.79(30cd941018ec1a704c68177a49f746d2)] リクエスト送信 params => 【ab255a13-83fb-4bf2-9264-525524a5080b】
~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~
[2019-12-09 23:34:06.35(4de3ed283bbab693587359c7a53166b7)] リクエスト受信 params => 【e923b5b4-c07b-42e4-a050-56cc3526ddd3】
[2019-12-09 23:34:06.35(63cfc0e59444a18e5858e6b8cb53b6ff)] リクエスト受信 params => 【ea76cd1f-ca91-4d2d-88ad-158fdd31fc37】
[2019-12-09 23:34:06.40(8355c676546235af1cac5d31989d5e5a)] リクエスト送信 params => 【d951a794-11cd-45c8-966f-07f20594de2f】
8355c676546235af1cac5d31989d5e5a
のリクエストがパラメータのUUID一致で表示されています。