Вопрос по python, logging – Как установить разные уровни для разных обработчиков журнала Python

45

Я прочитал несколько постов по этому вопросу, но я все еще в замешательстве. У меня есть эта настройка регистрации:

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?

Ваш Ответ

3   ответа
5

Я должен был использовать

logging.basicConfig(level=logging.DEBUG)

для того, чтобы это работало. В противном случае отличный ответ, спасибо!

Марио

PS: по какой-то причине система не позволяет мне комментировать ответ GrantVS напрямую.

64

аботчика ведения журнала, но, похоже, вам придется установить уровень средства ведения журнала на "самый низкий". В приведенном ниже примере я установил для регистратора значение 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");
ifelsemonkey, import logging.handlers должен привести к отсутствующим обработчикам.
да, ключ для этого должен установитьlogger вlogging.DEBUG уровень, так что обработчики могут фильтровать с этого уровня, в противном случае все происходит изlogging.WARNING уровень по умолчанию.
Я вижу ограничения этого метода, но на самом деле он будет работать для меня на этот раз, и его гораздо проще реализовать .. Thx MFB
У меня не сработалоAttributeError: 'module' object has no attribute 'handlers'
2

Мне нужно было время, чтобы понять суть

  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

Похожие вопросы