로그(Logs) — 타임스탬프가 찍힌 텍스트 레코드

로그(Logs) — 타임스탬프가 찍힌 텍스트 레코드

로그는 타임스탬프가 찍힌 텍스트 레코드로, 구조화(structured, 권장)되거나 비구조화(unstructured)될 수 있고 선택적 메타데이터를 가질 수 있어요. 모든 텔레메트리 신호 중에서 로그는 가장 오래된 유산(legacy)이 가장 큰 신호예요. 대부분의 프로그래밍 언어가 기본 로깅 기능을 갖추거나 널리 쓰이는 로깅 라이브러리를 가지고 있을 정도죠. OpenTelemetry는 여러분이 이미 만들고 있는 로그와 함께 동작하도록 설계되어, 로그를 다른 신호와 연관 짓고 컨텍스트 속성을 추가하며 여러 소스를 공통 표현으로 정규화해 주는 도구를 제공해요.

출처: https://opentelemetry.io/docs/concepts/signals/logs/

본문

OpenTelemetry 로그

OpenTelemetry는 로그 레코드를 만들기 위한 Logs API와 SDK, 그리고 기존 로깅 프레임워크에 통합하기 위한 언어별 SDK와 **로깅 브릿지(logging bridge)**를 제공해요. Logging Provider를 통해 보내는 모든 것이 로그이며, 이벤트(event)는 로그의 특수한 한 종류예요. 모든 로그가 이벤트는 아니지만, 모든 이벤트는 로그랍니다.

애플리케이션에서의 OpenTelemetry 로그

애플리케이션에서 OpenTelemetry 로그는 어떤 로깅 라이브러리나 내장 로깅 기능으로도 만들어져요. 자동 계측(autoinstrumentation)을 추가하거나 SDK를 활성화하면, OpenTelemetry가 기존 로그를 활성 트레이스·스팬과 자동으로 연관 지어 로그 본문을 그들의 ID로 감싸요. 다시 말해, OpenTelemetry는 로그와 트레이스를 자동으로 상관관계를 만들어 줘요.

언어 지원(Language Support)

로그는 OpenTelemetry 스펙에서 안정(stable) 신호예요. 개별 언어별 Logs API & SDK 구현 상태는 언어별 문서에서 확인할 수 있어요.

구조화·비구조화·반구조화 로그

OpenTelemetry는 어떤 로그 형식이든 받아들이지만, 모든 형식이 분석에 똑같이 유용한 것은 아니에요.

  • 구조화 로그(Structured): JSON처럼 이름-값 쌍이 정해진 필드를 갖는 형식. 예를 들어 timestamp, level, service, message 같은 필드를 담은 JSON 로그가 대표적이에요.
  • 반구조화/비구조화 로그: 필드가 고정되지 않은 형식. 이 경우 필요한 부분을 파싱해 공통 표현으로 추출해 정규화된 레코드로 만들면 다운스트림 도구가 일관되게 분석할 수 있어요. OpenTelemetry Collector의 filelogreceiver가 혼합 형식을 파싱하는 헬퍼를 제공해요.

로깅 컴포넌트

  • Log Record Exporter: 로그 레코드를 소비자(consumer)에게 전송해요. 표준 출력, OpenTelemetry Collector, 또는 선택한 오픈소스·벤더 백엔드가 될 수 있어요.
  • Log Record: 이벤트의 기록을 나타내며, 두 종류의 필드를 담아요. ① 타입과 의미가 정해진 명명된 최상위 필드, ② 임의의 값과 타입을 갖는 Resource·attributes 필드예요.

더 알아보기

  • 로그·트레이스 연관: SDK가 로그에 Trace ID·Span ID를 주입하는 자동 상관관계
  • OpenTelemetry Collector: filelogreceiver 등 로그 파싱 헬퍼
  • 스펙: 더 자세한 내용은 OpenTelemetry 로그 신호 스펙 참고