JSON 로깅 & Datadog
로깅에 JSON을 사용해야 하는 이유
현재 JSON 로깅을 사용하지 않는다면, 아마도 일반 텍스트 로그와 정규식에 의존하여 로그를 이해하고 있을 것입니다. 처음에는 효과가 있을 수 있지만, 시스템이 성장함에 따라 구조가 깨지고 손실되기 시작하며 점점 더 악화될 것입니다. JSON 로깅이 표준입니다. 최신 애플리케이션에서 구조화되고 쉽게 구문 분석할 수 있는 로그는 더 이상 선택 사항이 아닙니다. 서비스 전반에서 일관성을 유지하면서 유연성을 확보할 수 있습니다.
데이터독이 JSON 로깅을 권장하는 데는 이유가 있습니다. 로그가 유효한 JSON으로 전송되면 Datadog의 전처리기가 자동으로 로그를 구문 분석하여 오버헤드를 줄이고 일관된 필드 추출을 보장하는 여러 예약된 속성에 매핑합니다. 이러한 예약된 속성은 가장 관련성이 높은 필드를 제공하므로 다른 시스템과의 통합, 로그 필터링, 효율적인 검색, 알림 설정이 쉬워지므로 추가 구성이 필요하지 않습니다. 중요한 예약 속성에는 통합 가시성 및 문제 해결에 필수적인 호스트, 서비스, 상태, 추적 ID, 스팬 ID 등이 있습니다.
설정 방법
제 경험상 JSON 로깅을 가장 잘 구성하는 방법에 대한 리소스가 풍부했습니다. 제가 주로 참고한 것은 Datadog의 문서였습니다: https://docs.datadoghq.com/logs/log_collection/java/?tab=logback. Datadog은 우리가 주로 사용하는 통합 가시성 도구였고 문제가 발생하면 더 쉽게 문제를 해결할 수 있었기 때문에 가장 적합하다고 생각했습니다.
Datadog 문서를 가이드로 삼아 로그백-spring.xml 구성 파일을 만드는 것으로 시작했습니다. 대부분의 작업이 이곳에서 이루어집니다. 처음에는 다양한 JSON 인코더를 실험해보고 도움이 될 것 같은 필드를 추가했습니다. 결국 저는 단순함의 힘을 깨달았습니다. 깔끔하고 최소한의 구성이 유지 관리가 쉽고 고장 가능성도 적다는 사실을요.
<springProfile name="json-logs">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
필요한 Logback 종속성을 추가하고 이 코드를 logback-spring.xml 파일에 추가한 후, 마지막 주요 단계는 애플리케이션 YAML에서 'json-logs'를 활성 Spring 프로필로 설정하는 것입니다. 이렇게 하면 환경 전체에서 JSON 로깅이 활성화되고 모든 서비스에서 일관되게 작동합니다.
이 단계를 올바르게 수행했다면 로그를 추적하여 결과를 확인할 수 있어야 합니다. 이와 유사한 키-값 로그에 있어야 합니다:
{"@timestamp":"2025-1-13T13:02:27.512333-02:00","@version":"1","message":"Tomcat initialized with port 8080(http)",
"logger_name":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer","thread_name":"main","level":"INFO",
"level_value":20000,"appName":"json-logs"}
이 시점에서 Datadog의 로그는 구조화되어 있어야 하고, 추적 ID가 있는 로그에 대해 추적 상관 관계가 작동해야 하며, 보다 상세하고 일관된 속성을 볼 수 있어야 합니다.
일반적인 실수 & 조언
- 시스템에 가장 적합한 파일 애펜더를 사용하세요. 우리 환경에서는 콘솔 애펜더가 더 적합했습니다.
- 다양한 JSON 인코더 옵션에 얽매이지 마세요. 적어도 처음에는 단순할수록 좋습니다.
- Datadog 에이전트에서 기존 로그 처리 규칙을 확인하세요. 이러한 규칙은 JSON 로그를 방해하여 올바르게 구문 분석되거나 전달되지 못하게 할 수 있습니다. 레거시 로거가 구성과 충돌하지 않는지 확인하세요.
- 더 많은 제어를 원한다면 여러 개의 Spring 프로필을 만드는 것이 좋습니다. 이를 통해 애플리케이션 코드를 변경하지 않고도 여러 환경에서 로깅 수준이나 형식을 전환할 수 있습니다.
- Datadog의 많은 로그에 대해 추적이 작동하지 않는 경우, 이는 많은 로그에 대해 자동으로 추적을 샘플링하기 때문입니다. JSON이 작동 중이므로 걱정하지 마시고 다른 비율로 설정할 수 있습니다.
올바른 설정을 사용하면 Datadog의 JSON 로깅이 안정적이고 유지 관리가 훨씬 쉬워집니다. 기존 가정을 제거하고 구성을 단순하게 유지하면 구조화된 로그, 일관된 필드, 추적 상관관계, 더 쉬운 필터링 및 알림을 얻을 수 있습니다. JSON 로깅은 모범 사례일 뿐만 아니라 최신 애플리케이션에서 통합 가시성을 개선하는 데 필수적입니다.
저자 소개
들으신 내용이 마음에 드시나요? 어떤 것이 적합한지 궁금한 점이 있으신가요? 상담하고 싶어요! 문의하기