Cloud Functions나 Lambda 환경에서 로그를 다루다 보면, 단순 print()
만으로는 운영 환경에서의 추적성이 매우 떨어지기 때문에 logging을 사용해야합니다. 그래서 오늘은 logging에 대해 정리해보고자합니다.
print()
만 쓰면 운영 로그가 정리가 안 됨처음엔 아래처럼 단순하게 로그를 찍었습니다.
print("raw TSV 파일 저장 완료")
print(f"업로드 대상 S3 버킷: {bucket_name}")
하지만 실제 운영 중엔 이런 문제가 생겼습니다.
logging
도입으로 로그 레벨을 분리하고 추적 용이성 향상logging
을 통한 구조적인 로그 구성(보통 main.py에 많이 작성합니다.)
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
이제 이렇게 원하는 정도에 맞춰 로그를 남길 수 있습니다.
logger.info("파일 저장 완료: %s", output_path)
logger.debug("전체 상품 수: %d", len(all_products))
logger.error("에러 발생: %s", str(e))
logging.basicConfig(level=logging.INFO)
를 써야 했을까?logging
설정은 레벨이 WARNING
이상만 출력됩니다.INFO
이하 메시지를 보기 위해선 레벨 설정을 명시적으로 해야 합니다.Cloud Functions
에서도 이 설정을 적용하면 DEBUG
, INFO
, ERROR
등 레벨에 맞춰 구글 로그 뷰어에서 필터링이 가능합니다.레벨 | 용도 | 예시 |
---|---|---|
DEBUG | 상세한 내부 상태 추적용 (로컬 디버깅 중심) | 상품 수, 카테고리 추출 등 |
INFO | 정상 처리 흐름 로그 | "TSV 저장 완료", "S3 업로드 완료" |
WARNING | 경고 수준 (무시 가능하지만 기록 필요) | 일부 누락된 필드 등 |
ERROR | 예외 발생 시 | 네이버 API 실패, 인증 오류 등 |
main.py
기준 기본 구성# main.py 상단
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 예외 처리
try:
...
logger.info("S3 업로드 완료: %s", final_output)
except Exception as e:
logger.error("에러 발생 ❌: %s", str(e), exc_info=True)
print()
는 로컬 디버깅에 적합, 운영에선 logging
이 무조건 유리