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
'파이썬' 카테고리의 다른 글
Python 터미널 명령어에서 인자 받기: argparse (0) | 2025.03.28 |
---|---|
파이썬 퀀트투자(7): 재무제표 크롤링, 적재 (3) | 2024.10.12 |
파이썬 퀀트투자(6): 네이버금융 수정주가 크롤링, 적재 (4) | 2024.10.12 |
파이썬 퀀트투자(5): WICS 기준 섹터정보 크롤링, 적재 (2) | 2024.10.12 |
파이썬 퀀트투자(3): 한국거래소 개별종목 지표 크롤링 (3) | 2024.10.09 |
댓글