AsyncLocalStorage で リクエストのログを出力

目次

各リクエストの非同期処理に紐づく値を保持できます。

AsyncLocalStorage は Node.js が提供するクラスです。

各リクエストの非同期処理毎に独立した値(ストア)を保持できます。

その値としてロガーを保持すれば、リクエストごとに異なるロガーを参照できます。

各リクエストに紐づくロガーは分離して使用できるので、リクエストIDなどを付与させることも可能です

AsyncLocalStorage 自体がロガーを作るわけではありません。ロガー自体は pino とか フレームワークなどで別で作成する必要があります

https://nodejs.org/api/async_context.html#asynchronous-context-tracking
各インスタンスは
AsyncLocalStorage独立したストレージコンテキストを保持します。複数のインスタンスが同時に存在しても、互いのデータに干渉するリスクはありません。

グローバル変数とAsyncLocalStorageの比較 同一の時間軸上で、リクエストAのawait中にリクエストBが割り込む状況を比較する。グローバル変数は1つの領域を共有するためAが再開した時点で値がBに上書きされている。AsyncLocalStorageはリクエストごとに独立したコンテキストを持つため、awaitをまたいでもAは”A”、Bは”B”のまま保たれる。 リクエストごとの値を独立させる — AsyncLocalStorage 時間

Node.js AsyncLocalStorage 公式ドキュメント
https://nodejs.org/api/async_context.html#asynchronous-context-tracking

TypeScript で使用する場合、ジェネリクスで型を指定できます

AsyncLocalStorage<T>

AsyncLocalStorage の主要なメソッド

run(store, callback)指定した値を保持した状態で、callback を実行します。

storage.run({ requestId: 'abc' }, () => {
  // この中では requestId を取得できる
})

storage.run(store, callback)

  • 第1引数 store
    その非同期処理で保持したい値です。
  • 第2引数 callback
    その store を有効にした状態で実行する処理です。

getStore()現在保持されている値を取得します。

const store = storage.getStore()

enterWith(store)現在の非同期処理に値を設定します。

storage.enterWith({ requestId: 'abc' })
目次