Context とは
Laravel の Context 機能は、リクエスト・キュージョブ・コマンドの実行をまたいで情報を記録・共有するための仕組みです。Illuminate\Support\Facades\Context ファサードを通じて情報を追加すると、その情報はアプリケーションが書き出すすべてのログエントリに自動的に付与されます。
これにより、個別のログ呼び出しに渡した情報と、Context が保持する共有情報を明確に区別できます。
分散システムやキューを使ったアーキテクチャでトレーシングを行う際に特に有用です。
コンテキストの伝播フロー
基本的な使い方
最も典型的な使い方はミドルウェアでtrace_id を設定することです。以降のすべてのログエントリに自動的に含まれます。
1
ミドルウェアを作成する
2
Context にトレース ID を追加する
3
ミドルウェアを登録する
bootstrap/app.php でグローバルミドルウェアとして登録します。url と trace_id が自動的に付与されます。
コンテキストへの書き込み
add — 値を追加する
add は既存のキーを上書きします。キーが存在しない場合のみ追加したいときは addIf を使います。
increment / decrement — カウンターを管理する
数値を増減させる専用メソッドです。第2引数で変化量を指定できます。when — 条件付きで追加する
when メソッドを使うと条件が true のとき・false のときそれぞれで異なるデータを追加できます。
push — スタックに追加する
Context はリスト形式のデータを保持する「スタック」をサポートしています。push を使うと追加した順序でデータが積み重なります。
コンテキストの取得
get / all
only / except — 一部だけ取得する
pull / pop — 取得して削除する
pull はキーの値を取得すると同時にコンテキストから削除します。
pop を使います。
remember — 存在しなければ設定して返す
has / missing — キーの存在確認
has は null が格納されていても true を返します。キーが登録されているかどうかだけを確認します。コンテキストの削除
forget でキーを削除します。
スコープ付きコンテキスト
scope メソッドを使うと、クロージャの実行中だけコンテキストを一時的に変更し、実行後に元の状態へ自動的に戻せます。
テストや局所的な処理で一時的な追加情報をログに含めたいときに便利です。
Hidden Context
ログに出力したくないデータ(パスワード・APIキー・個人識別情報など)は Hidden Context に格納します。 通常のget メソッドでは取得できず、getHidden などの専用メソッドでのみアクセスできます。
キュージョブへの引き継ぎ
ジョブをキューにディスパッチすると、現在のコンテキストは自動的にシリアライズされてジョブのペイロードに含まれます。 ジョブ実行時に元のコンテキストが復元されるため、リクエストで付与したtrace_id がキュー上のログにも自動的に引き継がれます。
trace_id がキュー上のログにも含まれることが確認できます。
Dehydrating — ジョブ送信時のカスタマイズ
Context::dehydrating を使うと、ジョブ送信の直前にコンテキストを加工できます。
たとえば、Accept-Language ヘッダーで決まるロケールをキューに渡したい場合に使います。
Hydrated — ジョブ実行時の復元
Context::hydrated を使うと、ジョブ実行の直前にコンテキストが復元されたタイミングで処理を追加できます。
たとえば、保存していたロケールを設定ファイルに反映させます。
まとめ
Context vs Log::withContext の違い
Context vs Log::withContext の違い
Dehydrate/Hydrate のよくある使いパターン
Dehydrate/Hydrate のよくある使いパターン
- ロケールの引き継ぎ:
dehydratingでapp.localeを Hidden Context に保存し、hydratedでConfig::setして復元。 - 認証情報の伝播: リクエストで認証したユーザーの情報をキュージョブでも参照できるようにする。
- テナント ID: マルチテナントアプリでテナント識別子をキューをまたいで共有する。