AI Briefing

무신사, 로그로 인한 서비스 장애 해결: 30줄 코드로 비동기 로깅과 trace_id 동시 확보

·2026.10.02 07:01

핵심 내용

stdout 버퍼 포화로 인한 커넥션 풀 고갈 장애를 커스텀 Appender로 해결하고, 비동기 로깅과 trace_id 보존을 동시에 달성했다.

1 / 9

자세히 보기

무신사 PEL 조직은 고트래픽 서비스에서 stdout 버퍼 포화로 요청 스레드가 대기하며 커넥션 풀이 고갈되는 장애를 겪었다. 이는 관측성을 위해 AsyncAppender 사용을 금지하고 동기 로깅을 적용한 전사 표준 가이드의 부작용이었다.

장애 원인: 동기 로깅의 한계

동기 로깅은 요청 스레드가 직접 stdout에 쓰기를 수행한다. 로그량이 평소의 100배로 급증하면 64KB 파이프 버퍼가 가득 차고, 스레드는 30초 커넥션 획득 타임아웃까지 대기하게 된다. 이는 서비스 전체의 가용성 저하로 이어졌다.

해결책: TraceAwareAsyncAppender

개발팀은 AsyncAppender를 상속한 커스텀 TraceAwareAsyncAppender를 도입했다. 이 방식은 로그 이벤트를 큐에 넣기 전, caller 스레드에서 OpenTelemetry의 trace_id와 span_id를 미리 캡처한다. 약 30줄의 코드로 비동기 로깅의 성능 이점과 분산 추적의 관측성을 동시에 확보했다.

검증 결과

부하 테스트에서 초당 1만 5천 줄의 극한 로그량에서도 출력된 로그의 trace_id 결측률은 **0%**였다. neverBlock 정책으로 로그 일부가 드롭되더라도 요청 스레드는 대기하지 않으며, p95 응답 시간은 29ms로 유지됐다.

이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.

AI 처리 방식을 확인하거나, 요약 오류와 출처 표기 문제, 삭제 요청을 문의 · 건의로 알려주세요.