4
1

More than 3 years have passed since last update.

Node.jsでのリクエストIDのログ出力(express, log4js, request-context)

Posted at

概要

Node.jsのexpressベースのWebアプリで、リクエストIDをログ出力します。
今回、log4js、request-contextを使用しました。

request-contextで、リクエスト毎にリクエストIDを保持します。
log4jsのtokensに、リクエストIDをセットして、patternでリクエストIDを出力するようにしています。

参照情報

参考にさせていただいたページは下記です。

注意点

request-contextは、下記の通り、Node.jsのdeprecatedになっているdomainに依存しています。参照先2でも指摘されており、より詳しく記載されています。
request-context

See the Domain Docs for further information on error handling for domains. Note that the domain module is pending deprecation!

サンプルコード

今回は、リクエスト毎に、uuidでリクエストを発行するようにしています。
contextService.setのところでリクエストIDを保持させています。

app.js
const express = require('express');
const app = express();
const contextService = require('request-context');
const uuid = require('uuid/v4');
const logger = require("./logger").logger();

app.use(contextService.middleware('request'));
app.use((req, res, next) => {
  const requestId = uuid();
  contextService.set('request:requestId', requestId);
  logger.info("Start API.", req.method, req.originalUrl);
  next();
});

app.get('/', function (req, res) {
  res.send('hello world');
  logger.info("End API.");
})

app.listen(3000)

getRequestIdで、保持しているリクエストIDを取得しています。
layoutのpatternの%x{requestId}がリクエストIDです。

logger.js
const log4js = require("log4js");
const contextService = require('request-context');
const getRequestId = function() {
  return contextService.get('request:requestId');
};

log4js.configure({
  appenders: {
    console:{
      type:'console',
      layout:{
        type:'pattern',
        pattern:'[%d] [%x{requestId}] %[[%p]%] [%c] %m',
        tokens: {
          requestId: getRequestId
        }
      }
    }
  },
  categories:{
    default:{appenders:['console'], level:'info'}
  }
});

exports.logger = function(){
  const logger = log4js.getLogger('default');
  return logger;
};

ログ出力結果

下記のようにリクエスト毎に、リクエストIDが出力されます。

[2019-11-26T11:24:46.451] [ef9b0c23-53f2-4c7b-bce3-0def665fbc08] [INFO] [default] Start API. GET /
[2019-11-26T11:24:46.460] [ef9b0c23-53f2-4c7b-bce3-0def665fbc08] [INFO] [default] End API.
[2019-11-26T11:24:49.588] [4af4ffed-a22f-4b81-806a-1cdcff4b7c22] [INFO] [default] Start API. GET /
[2019-11-26T11:24:49.590] [4af4ffed-a22f-4b81-806a-1cdcff4b7c22] [INFO] [default] End API.
[2019-11-26T11:24:51.226] [360033c9-e6eb-405c-b3a7-6ac9e20b3fa4] [INFO] [default] Start API. GET /
[2019-11-26T11:24:51.227] [360033c9-e6eb-405c-b3a7-6ac9e20b3fa4] [INFO] [default] End API.
[2019-11-26T11:24:53.371] [048a8ce6-1bd8-4514-89df-aa467419e0ce] [INFO] [default] Start API. GET /
[2019-11-26T11:24:53.372] [048a8ce6-1bd8-4514-89df-aa467419e0ce] [INFO] [default] End API.
4
1
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
4
1