본문 바로가기
WIKI 기술 지식 베이스

Python 로그와 트레이스 상호 연관 (Correlating Python Logs and Traces)

원문 보기 위키 갱신

Python 애플리케이션의 로그에 트레이스 ID를 주입해 Datadog에서 로그와 트레이스를 연결하는 방법을 안내해요.

출처: 문서

본문

주입

표준 라이브러리 로깅

트레이스를 로그와 상호 연관하려면 다음 단계를 완료해요:

  1. 자동 계측을 활성화해요.
  2. 로그 레코드에서 필요한 속성을 포함해요.
1단계 - 자동 계측 활성화

다음 옵션 중 하나를 사용해 자동 계측을 활성화해요:

옵션 1: Library Injection:

  1. Library Injection의 지침을 따라 트레이싱을 설정해요.
  2. 이전 트레이스 버전(ddtrace<3.11)의 경우 애플리케이션 deployment/manifest 파일에 환경 변수 DD_LOGS_INJECTION=true를 설정해요.

옵션 2: ddtrace-run:

  1. 애플리케이션에 ddtrace를 가져와요.
  2. ddtrace-run으로 애플리케이션을 실행해요 (예: ddtrace-run python appname.py).

옵션 3: import ddtrace.auto:

  1. 애플리케이션에 ddtrace.auto를 가져와요. 이렇게 하면 logging, logback, loguru 및/또는 structlog 통합이 자동으로 활성화돼요.
2단계 - 필요한 속성 포함

로그 형식을 업데이트해 로그 레코드에서 필요한 속성을 포함해요.

형식 문자열에 로그 레코드의 dd.env, dd.service, dd.version, dd.trace_id, dd.span_id 속성을 포함해요.

logging.basicConfig를 사용해 로그 주입을 구성하는 예시는 다음과 같아요. ddtrace-run 또는 import ddtrace.auto가 필요하다는 점에 주의하세요:

import logging
from ddtrace import tracer

FORMAT = ('%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] '
          '[dd.service=%(dd.service)s dd.env=%(dd.env)s dd.version=%(dd.version)s dd.trace_id=%(dd.trace_id)s dd.span_id=%(dd.span_id)s] '
          '- %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger(__name__)
log.level = logging.INFO

@tracer.wrap()
def hello():
    log.info('Hello, World!')

hello()

로그 주입에 대해 자세히 알아보려면 ddtrace 문서를 읽어보세요.

표준 라이브러리 로깅이 없는 경우

기본적으로 ddtrace.trace.tracer.log_correlation은 dd.env=<ENV> dd.service=<SERVICE> dd.version=<VERSION> dd.trace_id=<TRACE_ID> dd.span_id=<SPAN_ID>를 반환해요.

from ddtrace import tracer

log_correlation_dict = tracer.get_log_correlation_context()

이 접근 방식의 예시로, 다음 예시는 structlog에서 함수를 프로세서로 정의해 트레이서 필드를 로그 출력에 추가해요:

import ddtrace
from ddtrace import tracer

import structlog

def tracer_injection(logger, log_method, event_dict):
    # 현재 트레이서 컨텍스트에서 상호 연관 id 가져오기
    event_dict.update(tracer.get_log_correlation_context())
    return event_dict

structlog.configure(
    processors=[
        tracer_injection,
        structlog.processors.JSONRenderer()
    ]
)
log = structlog.get_logger()

로거를 구성한 후 이벤트를 로그하는 추적된 함수를 실행하면 주입된 트레이서 정보가 생성돼요:

>>> traced_func()
{"event": "In tracer context", "dd.trace_id": 9982398928418628468, "dd.span_id": 10130028953923355146, "dd.env": "dev", "dd.service": "hello", "dd.version": "abc123"}

참고: 로그를 파싱하기 위해 Datadog 로그 통합을 사용하지 않는다면, 커스텀 로그 파싱 규칙에서 dd.trace_id와 dd.span_id가 문자열로 파싱되고 Trace Remapper로 리매핑되도록 해야 해요. 자세한 내용은 연관된 로그가 트레이스 ID 패널에 표시되지 않음을 참조하세요.

Python 로그가 자동으로 파싱되도록 Python Log Integration이 제대로 구성되었는지 확인하려면 Python 로깅 문서를 참조하세요.

더 알아보기 (Learn more)