programing

다른 파이썬 로그 핸들러에 대해 다른 수준을 설정하는 방법

randomtip 2021. 1. 15. 08:06
반응형

다른 파이썬 로그 핸들러에 대해 다른 수준을 설정하는 방법


나는 이것에 대한 몇 개의 게시물을 읽었지만 여전히 혼란 스럽습니다. 이 로깅 설정이 있습니다.

import logging

class MongoHandler(logging.Handler):
    def __init__(self):
        logging.Handler.__init__(self)
        from pymongo import Connection
        self.db = Connection('db_server').db_name

    def emit(self, record):
        try:
            self.db.Logging.save(record.__dict__)
        except:
            print 'Logging Error:  Unable to save log entry to db'

mh = MongoHandler()
sh = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(threadName)s - %(levelname)s - %(message)s')
sh.setFormatter(formatter)
log = logging.getLogger('DeviceMonitor_%s' % hostname)
log.addHandler(mh)
log.addHandler(sh)
log.setLevel(logging.INFO)

StreamHandler와 MongoHandler에 대해 다른 수준을 설정할 수 있기를 원합니다. 가능합니까 아니면 두 번째 Logger obj가 필요합니까?


각 로깅 처리기에 대해 다른 로깅 수준을 설정할 수 있지만 로거의 수준을 "최저"로 설정해야 할 것 같습니다. 아래 예제에서는 로거를 DEBUG로, 스트림 핸들러를 INFO로, TimedRotatingFileHandler를 DEBUG로 설정했습니다. 따라서 파일에는 DEBUG 항목이 있고 스트림은 INFO 만 출력합니다. DEBUG 만 하나에, INFO 만 다른 핸들러에 보낼 수는 없습니다. 이를 위해서는 다른 로거가 필요합니다.

logger = logging.getLogger("mylog")
formatter = logging.Formatter('%(asctime)s | %(name)s |  %(levelname)s: %(message)s')
logger.setLevel(logging.DEBUG)

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

logFilePath = "my.log"
file_handler = logging.handlers.TimedRotatingFileHandler(filename = logFilePath, when = 'midnight', backupCount = 30)
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.DEBUG)

logger.addHandler(file_handler)
logger.addHandler(stream_handler)

logger.info("Started");
try:
    x = 14
    y = 0
    z = x / y
except Exception as ex:
    logger.error("Operation failed.")
    logger.debug("Encountered {0} when trying to perform calculation.".format(ex))

logger.info("Ended");

GrantVS의 답변에 추가 :

나는 사용해야했다

logging.basicConfig(level=logging.DEBUG)

작동하려면. 그렇지 않으면 훌륭한 대답, 감사합니다!

마리오

PS: For some reason the system doesn't let me comment GrantVS's answer directly.


I needed a time to understand the point

  1. Set the general logger below your subloggers (handlers) (your result of logging.getLogger())
  2. Set your subloggers levels on an equal or superior level to your general logger

ReferenceURL : https://stackoverflow.com/questions/11111064/how-to-set-different-levels-for-different-python-log-handlers

반응형