AWS Lambda 애플리케이션 로그 레벨 설정 방법

Sue·2025년 9월 5일
0
post-thumbnail

AWS Lambda 애플리케이션 로그 누락 문제 해결 가이드

이 가이드는 Python Lambda 함수에서 logger를 사용한 로그가 CloudWatch에 보이지 않는 문제를 진단하고 해결하는 전체 과정을 정리한 것입니다.

1. 문제 상황 (The Problem)

  • 현상: 코드에 logger.info(), logger.debug() 등 로그 출력 구문을 작성했음에도 불구하고, AWS CloudWatch Logs에서는 해당 로그들이 전혀 보이지 않았습니다.
  • 관찰된 로그: Lambda 실행 시작/종료/리포트를 알리는 시스템 로그(START, END, REPORT)만 기록되었습니다.
  • 목표: 디버깅과 성공적인 API 응답 확인을 위해 코드에서 의도한 모든 애플리케이션 로그를 CloudWatch에서 확인하는 것.

2. 원인 분석 (The Analysis)

조사와 테스트를 통해 확인된 핵심 원인은 다음과 같습니다.

  • 주요 원인: Lambda 함수의 로그 구성 설정
    Lambda는 코드 레벨의 로깅 설정과 별개로, 함수 자체의 실행 환경(Runtime)에 로그를 처리하는 방식을 설정할 수 있습니다. 이 설정이 코드의 설정을 덮어쓰거나 무시하게 만들어 로그가 누락되었습니다.

  • 발견 1: 로그 형식로그 수준의 연관 관계 (가장 중요)

    • Lambda의 로그 설정에는 로그 형식(Log format)애플리케이션 로그 수준(Application log level)이라는 두 가지 주요 옵션이 있습니다.
    • 로그 형식이 기본값인 Text로 설정되어 있으면, 로그를 단순 문자열로만 취급합니다. 이 상태에서는 로그의 중요도(INFO, DEBUG 등)를 구분할 수 없으므로, 애플리케이션 로그 수준 설정 자체가 비활성화됩니다.
    • 로그 형식JSON으로 변경해야만, Lambda가 로그를 {"level": "INFO", "message": "..."}와 같은 구조화된 데이터로 인식합니다. 이 때 비로소 애플리케이션 로그 수준 설정이 활성화되어, 특정 레벨 이상의 로그만 필터링하는 기능이 동작합니다.
  • 발견 2: 코드의 안정성 문제

    • AWS Lambda 환경은 이미 기본 로거(Root Logger)를 구성한 상태에서 코드를 실행합니다. 이 때문에 코드 시작 부분의 logging.basicConfig() 함수가 예상대로 동작하지 않거나 무시될 수 있습니다.

3. 해결 과정 (The Step-by-Step Solution)

아래의 단계적인 절차를 통해 문제를 해결했습니다.

  • Step 1: Lambda 구성 변경 (AWS Console에서 설정)

    1. 해당 Lambda 함수의 [구성(Configuration)] 탭으로 이동했습니다.
    2. 왼쪽 메뉴에서 [모니터링 및 운영 도구(Monitoring and operations tools)]를 클릭하고 [편집(Edit)] 버튼을 눌렀습니다.
    3. 로그 형식(Log format)Text에서 JSON으로 변경했습니다. (이것이 로그 수준 설정을 활성화하는 핵심 단계입니다.)
    4. 활성화된 애플리케이션 로그 수준(Application log level)INFO로 설정했습니다. (개발 시에는 DEBUG로 설정해도 좋습니다.)
    5. 설정을 [저장(Save)]하고 함수를 다시 테스트하여 로그가 정상적으로 출력되는 것을 확인했습니다.
  • Step 2: 안정적인 로깅을 위한 코드 수정 (권장 사항)

    • Lambda 환경에서 더 확실하게 동작하도록 로거 설정 코드를 수정했습니다.
    • 기존 방식:
      # import logging
      # logger = logging.getLogger(__name__)
      # logging.basicConfig(level=logging.INFO)
    • 변경 후 안정적인 방식:
      import logging
      # Lambda의 기본 로거를 가져와서 레벨을 설정
      logger = logging.getLogger()
      logger.setLevel(logging.INFO)

  • Step 3: 성공 응답 로깅 코드 추가

    • 정상적으로 처리된 API의 최종 응답 내용도 로그로 남기기 위해, return 직전에 아래 코드를 추가했습니다.
    # ... 이전 로직 ...
    response_data = {"data": data}
    
    # 최종 응답 데이터를 JSON 문자열로 변환하여 로그에 남김
    logger.info(f"[RESPONSE BODY] {json.dumps(response_data, indent=2, ensure_ascii=False)}")
    
    return ResponseManager.success(response_data)

최종 요약 (Key Takeaways)

  1. Lambda에서 애플리케이션 로그가 보이지 않는다면, 코드보다는 Lambda 함수 자체의 구성(Configuration)을 가장 먼저 확인해야 합니다.
  2. 로그 레벨(INFO, DEBUG 등)을 기준으로 로그를 필터링하려면, 반드시 로그 형식을 JSON으로 설정해야 합니다.
  3. 로그 형식을 JSON으로 바꾼 뒤, 애플리케이션 로그 수준을 원하는 레벨(INFO 등)로 설정해야 해당 레벨 이상의 모든 로그가 보입니다.
  4. 코드에서는 logging.basicConfig()보다 logging.getLogger().setLevel() 방식을 사용하는 것이 Lambda 환경에서 훨씬 안정적입니다.
profile
AI/ML Engineer

0개의 댓글