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

Python 로그 수집 (Log Collection)

원문 보기 위키 갱신

Python 로그를 Datadog로 보내려면 호스트의 파일에 로그를 남기도록 Python 로거(logger)를 설정한 다음, Datadog Agent로 그 파일을 tail 하면 돼요.

출처: 문서

본문

로거 설정하기 (Configure your logger)

Python 로그는 traceback 때문에 다루기 까다로울 수 있어요. Traceback 때문에 로그가 여러 줄로 나뉘어 원래 로그 이벤트와 연관 짓기가 어려워지거든요. 이 문제를 해결하기 위해 Datadog는 로깅 시 JSON 포맷터를 사용할 것을 강력히 권장합니다. 이렇게 하면:

  • 각 스택 트레이스가 올바른 로그에 감싸져요.
  • 로그 이벤트의 모든 속성(심각도, 로거 이름, 스레드 이름 등)이 올바르게 추출돼요.

다음 로깅 라이브러리의 설정 예시를 확인해 보세요.

*Python 로거에는 사용자 지정 속성을 추가하기 위한 extra 매개변수가 있어요. DJANGO_DATADOG_LOGGER_EXTRA_INCLUDE를 사용해 extra 매개변수를 추가하려는 로거 이름과 일치하는 정규식을 지정하세요.

Datadog Agent 설정하기 (Configure the Datadog Agent)

로그 수집을 활성화한 후 다음 단계에 따라 사용자 지정 로그 수집을 설정해 로그 파일을 tail 하여 Datadog로 보내 보세요:

  1. Agent 설정 디렉터리의 conf.d/에 python.d/ 폴더를 만드세요.
  2. conf.d/python.d/ 디렉터리에 다음 내용으로 conf.yaml 파일을 만드세요.
    init_config:
    
    instances:
    
    ##Log section
    logs:
    
      - type: file
        path: "<PATH_TO_PYTHON_LOG>.log"
        service: "<SERVICE_NAME>"
        source: python
        sourcecategory: sourcecode
        # For multiline logs, if they start by the date with the format yyyy-mm-dd uncomment the following processing rule
        #log_processing_rules:
        #  - type: multi_line
        #    name: new_log_start_with_date
        #    pattern: \d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])
    
  3. Agent를 재시작하세요.
  4. Agent의 status 하위 명령을 실행하고 Checks 섹션에서 python을 찾아 로그가 Datadog에 성공적으로 제출되는지 확인하세요.

로그가 JSON 형식이면 Datadog가 로그 메시지를 자동으로 파싱하여 로그 속성을 추출해요. Log Explorer를 사용해 로그를 확인하고 문제를 해결하세요.

로그와 트레이스 간 서비스 연결하기 (Connect your service across logs and traces)

이 애플리케이션에 APM이 활성화되어 있다면 APM Python 지침에 따라 trace ID, span ID, env, service, version을 로그에 자동으로 추가해 로그와 트레이스를 연결하세요.

참고: Datadog SDK가 로그에 service를 주입하면 Agent 설정에 설정된 값을 덮어써요.

이렇게 완료하면 로그는 다음과 같은 형식이 돼요:

2019-01-07 15:20:15,972 DEBUG [flask.app] [app.py:100] [dd.trace_id=5688176451479556031 dd.span_id=4663104081780224235] - this is an example

로그가 JSON 형식이라면 trace 값이 최상위 레벨 또는 최상위 레벨의 extra·record.extra 블록에 있을 때 자동으로 추출돼요. 다음은 trace 값이 자동으로 파싱되는 유효한 JSON 로그 예시입니다.

{
  "message":"Hello from the private method",
  "dd.trace_id":"18287620314539322434",
  "dd.span_id":"8440638443344356350",
  "dd.env":"dev",
  "dd.service":"logs",
  "dd.version":"1.0.0"
}
{
  "message":"Hello from the private method",
  "extra":{
    "dd.trace_id":"18287620314539322434",
    "dd.span_id":"8440638443344356350",
    "dd.env":"dev",
    "dd.service":"logs",
    "dd.version":"1.0.0"
  }
}
{
"message":"Hello from the private method",
  "record":{
    "extra":{
      "dd.trace_id":"1734396609740561719",
      "dd.span_id":"17877262712156101004",
      "dd.env":"dev",
      "dd.service":"logs",
      "dd.version":"1.0.0"
    }
  }
}

더 알아보기 (Learn more)