AsyncLocalStorageを使ってExpressのサーバーログにリクエストIDを出力する方法を紹介します。
AsyncLocalStorageは他言語のTLS(thread local storage, スレッド局所記憶)のような機能を提供し、リクエストごとにデータを保管してくれます。
asyncLocalStorage.ts
const { AsyncLocalStorage } = require('async_hooks');
export const asyncLocalStorage = new AsyncLocalStorage();
ミドルウェアでrequestIdをセット
index.ts
import Express from 'express';
import { v4 as uuid } from 'uuid';
import { asyncLocalStorage } from './asyncLocalStorage';
export const app = Express();
app.use((req, res, next) => {
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('requestId', uuid());
next();
});
});
requestIdをログに出力
logger.ts
import { asyncLocalStorage } from './asyncLocalStorage';
export default class Logger {
public static info = (): void => {
console.log(JSON.stringify({
requestId: Logger.requestId()
}));
};
private static requestId = () => {
return asyncLocalStorage.getStore().get('requestId');
};
}