본문 바로가기
파이썬

Python 로깅 최적화 방법

by 데분노트 2025. 3. 28.

Python 로깅 멋지게 하는 방법의 글을 참고해서 세팅한 후, Python에서 logging 모듈을 사용할 때, 로그가 과도하게 쌓이는 문제를 해결하는 방법을 정리합니다.

1. 로그 레벨 낮추기

현재 level="NOTSET"으로 설정되어 있으면 모든 로그가 기록됩니다. 필요 없는 디버그 로그를 줄이려면 INFO 이상만 기록하도록 조정합니다.

logging.basicConfig(level=logging.INFO)
수준 사용 시점
NOTSET  
DEBUG 상세한 정보. 보통 문제 진단할 때만 필요합니다.
INFO 예상대로 작동하는지에 대한 확인
WARNING 예상치 못한 일이 발생했거나 가까운 미래에 발생할 문제
ERROR 더욱 심각한 문제로 인해, 소프트웨어가 일부 기능을 수행하지 못했습니다.
CRITICAL 심각한 에러. 프로그램 자체가 계속 실행되지 않을 수 있음을 나타냅니다.

 

2. 특정 모듈 로그 차단

Selenium, urllib3 등의 라이브러리에서 불필요한 로그를 남기는 경우가 있습니다. 이를 제한하려면 다음과 같이 라이브러리별로 설정을 추가할 수 있습니다.

불필요한 모듈의 로그를 비활성화하면 쌓이는 로그를 줄일 수 있습니다.

logging.getLogger("selenium").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("asyncio").setLevel(logging.WARNING)

 

 

3. 중복 로그 방지

중복된 로그를 방지하려면 propagate = False 설정을 추가합니다.

logger = logging.getLogger("rich") logger.propagate = False

 

4. 로그 파일 크기 제한

로그 파일이 너무 커지지 않도록 최대 크기를 설정하고, 자동으로 롤링되도록 설정합니다.

from logging.handlers import RotatingFileHandler file_handler = RotatingFileHandler(LOG_PATH, mode="a", maxBytes=5*1024*1024, backupCount=3, encoding="utf-8") file_handler.setLevel(logging.WARNING) file_handler.setFormatter(logging.Formatter(FILE_HANDLER_FORMAT)) logger.addHandler(file_handler)

 

 

5. 특정 단어 필터링

로그에 특정 단어(예: selenium, request)가 포함된 경우 제외하려면, 커스텀 필터를 적용할 수 있습니다.

class IgnoreUnwantedLogs(logging.Filter): ​​​​def filter(self, record): ​​​​​​​​return "selenium" not in record.getMessage() and "request" not in record.getMessage() file_handler.addFilter(IgnoreUnwantedLogs())

 

 

최종 코드

위의 방법들을 종합하여 최적화된 set_logger 함수를 작성하면 다음과 같습니다.

import logging from rich.logging import RichHandler from logging.handlers import RotatingFileHandler LOG_PATH = "./log.log" RICH_FORMAT = "[%(filename)s:%(lineno)s] >> %(message)s" FILE_HANDLER_FORMAT = "[%(asctime)s]\\t%(levelname)s\\t[%(filename)s:%(funcName)s:%(lineno)s]\\t>> %(message)s" def set_logger() -> logging.Logger: ​​​​logging.basicConfig( ​​​​​​​​level=logging.INFO, # DEBUG → INFO (필요하면 WARNING으로 조정) ​​​​​​​​format=RICH_FORMAT, ​​​​​​​​handlers=[RichHandler(rich_tracebacks=True)] ​​​​) ​​​​ ​​​​logger = logging.getLogger("rich") ​​​​logger.propagate = False # 중복 로그 방지 ​​​​# 파일 핸들러 (5MB 이상이면 롤링, 최대 3개 백업) ​​​​file_handler = RotatingFileHandler(LOG_PATH, mode="a", maxBytes=5*1024*1024, backupCount=3, encoding="utf-8") ​​​​file_handler.setLevel(logging.WARNING) # WARNING 이상만 기록 ​​​​file_handler.setFormatter(logging.Formatter(FILE_HANDLER_FORMAT)) ​​​​logger.addHandler(file_handler) ​​​​# 특정 모듈 로그 줄이기 ​​​​logging.getLogger("selenium").setLevel(logging.WARNING) ​​​​logging.getLogger("urllib3").setLevel(logging.WARNING) ​​​​logging.getLogger("asyncio").setLevel(logging.WARNING) ​​​​return logger ​​​​ ​​​​ if __name__ == "__main__": ​​​​logger = set_logger() ​​​​sys.excepthook = handle_exception

 

 

결론

이제 불필요한 로그를 최소화하고, 필요한 로그만 남길 수 있습니다. 파일 크기를 관리하면서도 터미널에서는 필요한 정보를 확인할 수 있도록 설정했습니다.

 

Reference

- https://otzslayer.github.io/python/2021/10/18/python-logging-with-rich.html

댓글