Go(고) 언어로 서비스 개발 시, 개발자들은 항상 고민에 빠집니다. 디버그(Debug) 레벨 로그를 켜두면 프로덕션 환경이 너무 시끄럽고 성능 저하가 발생하며, 인포(Info) 레벨로 두면 에러가 발생했을 때 문제의 원인을 파악하기 위한 충분한 컨텍스트가 부족해집니다. 이러한 딜레마를 해결하기 위해 'dllog'라는 새로운 Go 라이브러리가 등장했습니다. dllog는 작업(operation) 단위로 로그를 버퍼링하여, 성공적인 작업은 조용하게 유지하고 실패한 작업에서만 관련 디버그 기록을 원래 타임스탬프와 함께 재생해줍니다.
dllog는 기존 로깅 라이브러리를 대체하는 것이 아니라, 이미 사용 중인 로거에 플러그인 방식으로 연동됩니다. 현재 Go의 표준 로깅 라이브러리인 `log/slog`와 인기 있는 `zap` 로깅 라이브러리를 지원하며, 심지어 하나의 서비스에서 두 라이브러리를 혼용하는 경우에도 작동합니다. 예를 들어, HTTP 서버의 핸들러를 `dllog.Middleware()`로 감싸거나, 일반 함수에서는 `dllog.Scope`를 열고 작업 실패 시 `dllog.Trip()`을 호출하여 버퍼링된 로그를 재생할 수 있습니다. 성공적인 요청의 경우, 버퍼는 폐기되어 아무런 로그도 남기지 않습니다.
이러한 접근 방식은 개발 및 운영(DevOps) 효율성을 크게 향상시킬 수 있습니다. 프로덕션 환경에서 불필요한 디버그 로그로 인한 성능 저하와 스토리지 비용을 줄이면서도, 에러 발생 시에는 즉시 상세한 디버그 정보를 얻을 수 있어 문제 해결 시간을 단축합니다. dllog는 버퍼링 비용을 최소화하도록 설계되었으며, 기본적으로 256개의 레코드를 저장하는 고정 크기의 링 버퍼를 사용해 메모리 사용량이 예측 가능합니다. 이는 개발자들이 디버그 로그의 유용성과 프로덕션 환경의 안정성 사이에서 더 이상 타협하지 않아도 됨을 의미합니다.