본문 바로가기

Dev/Python

Python 어플리케이션을 만들때의 로그 설정

 파이썬으로 크롤러같은 싱글 어플리케이션을 만들때, 로그파일을 따로 저장하고 싶으면 보통 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에 로그가 남는다.