이 가이드는 Python Lambda 함수에서 logger
를 사용한 로그가 CloudWatch에 보이지 않는 문제를 진단하고 해결하는 전체 과정을 정리한 것입니다.
logger.info()
, logger.debug()
등 로그 출력 구문을 작성했음에도 불구하고, AWS CloudWatch Logs에서는 해당 로그들이 전혀 보이지 않았습니다.START
, END
, REPORT
)만 기록되었습니다.조사와 테스트를 통해 확인된 핵심 원인은 다음과 같습니다.
주요 원인: Lambda 함수의 로그 구성 설정
Lambda는 코드 레벨의 로깅 설정과 별개로, 함수 자체의 실행 환경(Runtime)에 로그를 처리하는 방식을 설정할 수 있습니다. 이 설정이 코드의 설정을 덮어쓰거나 무시하게 만들어 로그가 누락되었습니다.
발견 1: 로그 형식
과 로그 수준
의 연관 관계 (가장 중요)
로그 형식(Log format)
과 애플리케이션 로그 수준(Application log level)
이라는 두 가지 주요 옵션이 있습니다.로그 형식
이 기본값인 Text
로 설정되어 있으면, 로그를 단순 문자열로만 취급합니다. 이 상태에서는 로그의 중요도(INFO
, DEBUG
등)를 구분할 수 없으므로, 애플리케이션 로그 수준
설정 자체가 비활성화됩니다.로그 형식
을 JSON
으로 변경해야만, Lambda가 로그를 {"level": "INFO", "message": "..."}
와 같은 구조화된 데이터로 인식합니다. 이 때 비로소 애플리케이션 로그 수준
설정이 활성화되어, 특정 레벨 이상의 로그만 필터링하는 기능이 동작합니다.발견 2: 코드의 안정성 문제
logging.basicConfig()
함수가 예상대로 동작하지 않거나 무시될 수 있습니다.아래의 단계적인 절차를 통해 문제를 해결했습니다.
Step 1: Lambda 구성 변경 (AWS Console에서 설정)
로그 형식(Log format)
을 Text
에서 JSON
으로 변경했습니다. (이것이 로그 수준 설정을 활성화하는 핵심 단계입니다.)애플리케이션 로그 수준(Application log level)
을 INFO
로 설정했습니다. (개발 시에는 DEBUG
로 설정해도 좋습니다.)Step 2: 안정적인 로깅을 위한 코드 수정 (권장 사항)
# import logging
# logger = logging.getLogger(__name__)
# logging.basicConfig(level=logging.INFO)
import logging
# Lambda의 기본 로거를 가져와서 레벨을 설정
logger = logging.getLogger()
logger.setLevel(logging.INFO)
Step 3: 성공 응답 로깅 코드 추가
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)
INFO
, DEBUG
등)을 기준으로 로그를 필터링하려면, 반드시 로그 형식을 JSON
으로 설정해야 합니다.JSON
으로 바꾼 뒤, 애플리케이션 로그 수준을 원하는 레벨(INFO
등)로 설정해야 해당 레벨 이상의 모든 로그가 보입니다.logging.basicConfig()
보다 logging.getLogger().setLevel()
방식을 사용하는 것이 Lambda 환경에서 훨씬 안정적입니다.