Laravel의 Context 기능은 요청·큐 잡·명령어의 실행을 넘나들며 정보를 기록·공유하기 위한 구조입니다.
Illuminate\Support\Facades\Context 파사드를 통해 정보를 추가하면 그 정보는 애플리케이션이 기록하는 모든 로그 엔트리에 자동으로 부여됩니다.이에 따라 개별 로그 호출에 전달한 정보와 Context가 유지하는 공유 정보를 명확하게 구별할 수 있습니다.
분산 시스템이나 큐를 사용한 아키텍처에서 트레이싱을 할 때 특히 유용합니다.
Context::add(['first_key' => 1, 'second_key' => 2]);Context::forget('first_key');Context::all();// ['second_key' => 2]// 여러 개를 함께 삭제Context::forget(['first_key', 'second_key']);
scope 메서드를 사용하면 클로저의 실행 중에만 컨텍스트를 일시적으로 변경하고, 실행 후에 원래 상태로 자동으로 되돌릴 수 있습니다.
테스트나 국소적인 처리에서 일시적인 추가 정보를 로그에 포함시키고 싶을 때 편리합니다.
use Illuminate\Support\Facades\Context;use Illuminate\Support\Facades\Log;Context::add('trace_id', 'abc-999');Context::addHidden('user_id', 123);Context::scope( function () { Context::add('action', 'adding_friend'); $userId = Context::getHidden('user_id'); Log::debug("Adding user [{$userId}] to friends list."); // Adding user [987] to friends list. {"trace_id":"abc-999","user_name":"taylor_otwell","action":"adding_friend"} }, data: ['user_name' => 'taylor_otwell'], hidden: ['user_id' => 987],);// 스코프 종료 후, 원래 값으로 돌아와 있음Context::all();// ['trace_id' => 'abc-999']Context::allHidden();// ['user_id' => 123]
스코프 내에서 객체를 변경한 경우, 그 변경은 스코프의 밖에도 반영됩니다. 원시값을 사용하는 경우는 문제 없습니다.
로그에 출력하고 싶지 않은 데이터(비밀번호·API 키·개인 식별 정보 등)는 Hidden Context에 저장합니다.
일반적인 get 메서드로는 취득할 수 없으며, getHidden 등의 전용 메서드로만 접근할 수 있습니다.
use Illuminate\Support\Facades\Context;Context::addHidden('key', 'value');Context::getHidden('key');// 'value'Context::get('key');// null — 일반 get 으로는 취득 불가능
잡을 큐에 디스패치하면 현재의 컨텍스트가 자동으로 직렬화되어 잡의 페이로드에 포함됩니다.
잡 실행 시에 원래의 컨텍스트가 복원되기 때문에, 요청에서 부여한 trace_id가 큐 상의 로그에도 자동으로 인계됩니다.
// 미들웨어에서 설정Context::add('trace_id', Str::uuid()->toString());// 컨트롤러에서 잡을 디스패치ProcessPodcast::dispatch($podcast);
class ProcessPodcast implements ShouldQueue{ use Queueable; public function handle(): void { Log::info('Processing podcast.', ['podcast_id' => $this->podcast->id]); }}