파이썬 로그 콘솔·파일 레벨 분리: DEBUG는 파일에, INFO는 콘솔에

Python 자동화에서 DEBUG는 파일에만 저장하고 INFO 이상은 콘솔에만 표시하려면 Logger는 DEBUG까지 열고, StreamHandler는 INFO, FileHandler는 DEBUG로 설정해야 합니다. Logger가 먼저 허용한 로그만 Handler로 전달되므로 Logger를 INFO로 두면 FileHandler를 DEBUG로 설정해도 DEBUG 레코드는 파일에 도착하지 않습니다. 반대로 Handler의 레벨은 각 출력 대상에서 한 번 더 걸러지는 기준입니다.

운영 중 콘솔을 DEBUG로 가득 채우면 현재 진행 상황을 읽기 어렵고, 파일에도 INFO만 남기면 장애가 발생한 뒤 원인을 좁히기 어렵습니다. 이 글에서는 두 출력의 기준을 나누는 순서와, 실행 전에 확인할 항목을 정리합니다.

먼저 결정할 레벨: Logger를 가장 낮은 공통 기준으로 열기

로그 흐름은 보통 다음 순서로 이해하면 쉽습니다.

  1. Logger가 레코드를 받아 최소 레벨을 확인합니다.
  2. 기준을 통과한 레코드가 연결된 Handler로 전달됩니다.
  3. 각 Handler가 자신의 최소 레벨에 따라 출력 여부를 결정합니다.

따라서 파일에 DEBUG를 보관하려면 Logger의 레벨은 DEBUG여야 합니다. 콘솔에서 DEBUG를 숨기는 일은 Logger가 아니라 StreamHandler의 레벨에 맡깁니다. 이 순서를 거꾸로 적용해 Logger를 INFO로 설정하면 FileHandler의 레벨을 DEBUG로 낮춰도 이미 사라진 DEBUG를 복원할 수 없습니다.

StreamHandler와 FileHandler를 각각 설정하는 예제

다음 예제는 콘솔에는 INFO 이상, automation.log 파일에는 DEBUG 이상을 기록하도록 구성합니다.

import logging


logger = logging.getLogger("automation")
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter(
    "%(asctime)s %(levelname)s %(name)s - %(message)s"
)

console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)

file_handler = logging.FileHandler("automation.log", encoding="utf-8")
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)

logger.addHandler(console_handler)
logger.addHandler(file_handler)

logger.debug("입력 데이터와 세부 흐름 확인")
logger.info("자동화 작업을 시작합니다")
logger.warning("재시도 가능한 응답을 받았습니다")

이 설정에서 logger.debug()는 FileHandler만 통과하고, logger.info()와 logger.warning()은 두 Handler를 모두 통과합니다. 그러므로 콘솔에는 INFO와 WARNING이 보이고, 파일에는 DEBUG·INFO·WARNING이 남습니다. 포맷터는 Handler마다 지정했기 때문에 필요하면 출력 대상별 형식도 따로 바꿀 수 있습니다.

설정이 기대와 다를 때 확인할 순서

1. Logger 레벨이 DEBUG인지 확인합니다

가장 먼저 logger.setLevel(logging.DEBUG)가 실제로 실행되는지 봅니다. 기본 root logger의 레벨은 WARNING이므로 별도 Logger를 구성하지 않고 기본 설정에 기대면 DEBUG와 INFO가 보이지 않을 수 있습니다.

2. 각 Handler의 레벨을 확인합니다

콘솔을 INFO 이상으로 제한하려면 StreamHandler에 INFO를 지정하고, 파일에 DEBUG까지 남기려면 FileHandler에 DEBUG를 지정합니다. Logger는 두 출력에 필요한 가장 낮은 레벨까지 열어 두고, 세부 제한은 Handler에서 담당하게 하는 방식입니다.

3. Handler를 반복해서 붙이지 않았는지 확인합니다

같은 이름으로 getLogger()를 다시 호출해도 같은 Logger 객체를 받습니다. 초기화 함수가 여러 번 실행되면서 Handler를 계속 추가하면 같은 로그가 중복 출력될 수 있으므로, 운영 코드에서는 설정 함수의 호출 시점과 logger.handlers 목록을 함께 점검하는 편이 안전합니다.

print(logger.handlers)

Handler 중복의 상세 원인이나 상위 Logger로 전파되는 구조까지 확인해야 한다면 파이썬 로그 파일이 안 생기는 이유와 logging 설정 점검법에서 파일 경로와 logging 구성을 함께 점검해 보시면 됩니다.

적용 전에 기억할 한 가지

Logger는 공통으로 통과시킬 최소 레벨을 정하고, Handler는 출력 대상별 최소 레벨을 정합니다. 이 관계만 지키면 콘솔을 조용하게 유지하면서도 파일에는 장애 분석에 필요한 DEBUG 흐름을 남길 수 있습니다. 이후 파일이 계속 커지는 문제가 생기면 이번 레벨 분리와 별개로 로테이션 정책을 검토해야 합니다.

출처

Leave a Comment