zone.jsを使用してexpressでリクエストIDを出力するミドルウェアの作成


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一致で表示されています。