파이썬으로 크롤러같은 싱글 어플리케이션을 만들때, 로그파일을 따로 저장하고 싶으면 보통 logging 을 사용하게 되는데, 콘솔에도 로거를 찍고 싶고, 파일은 따로 빼고 싶은데 날짜가 자정 12시가 넘어가면 자동으로 로그 rotate도 하고싶고, 특정 키워드를 필터링해서 따로 모아보고 싶고.. 나름 구글링을 해서 찾은 여러 가이드들을 참고해 작성한 코드인데 나중에도 쓸일이 많을것 같다.
import logging.config
from logging.handlers import TimedRotatingFileHandler
class LogFilter(logging.Filter):
def __init__(self, param=None):
self.param = param
def filter(self, record):
if self.param is None:
allow = False
else:
allow = self.param in record.msg
if allow:
record.msg = record.msg
return allow
log_config = {
"version": 1,
"formatters": {
"simple": {
"format": "%(asctime)s [%(levelname)s] - %(message)s"
}
},
"filters": {
"TEST": {
"()": LogFilter,
"param": "TEST"
},
"TOST": {
"()": LogFilter,
"param": "TOST"
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "INFO",
"formatter": "simple",
"stream": "ext://sys.stdout"
},
"common_log": {
"class": "logging.handlers.TimedRotatingFileHandler",
"level": "DEBUG",
"formatter": "simple",
"filename": "log/logname.log",
"when": "midnight", # 자정에 파일명을 logname.log.YYYY-MM-DD 로 백업하고 새로 로그파일을 시작한다.
"backupCount": 30
}
"test_file_handler": {
"class": "logging.FileHandler",
"level": "INFO",
"filters": ["TEST", "TOST"],
"formatter": "simple",
"filename": "log/TESTTOST.log"
},
},
"root": {
"level": "DEBUG",
"handlers": [
"console",
"common_log",
"test_file_handler"
]
}
}
## logger
logging.config.dictConfig(log_config)
logger = logging.getLogger()
## logger 사용
logger.info("HELLO WORLD!!!") # console, logname.log 에 로그가 남는다.
logger.info("HELLO TOST!!!") # console, logname.log, TESTTOST.log에 로그가 남는다.