Как установить разные уровни для разных обработчиков журнала Python

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

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)

Решение Вопроса

аботчика ведения журнала, но, похоже, вам придется установить уровень средства ведения журнала на "самый низкий". В приведенном ниже примере я установил для регистратора значение 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");
 20 дек. 2017 г., 08:21
ifelsemonkey, import logging.handlers должен привести к отсутствующим обработчикам.
 MFB20 июн. 2012 г., 02:24
Я вижу ограничения этого метода, но на самом деле он будет работать для меня на этот раз, и его гораздо проще реализовать .. Thx
 11 авг. 2018 г., 19:53
да, ключ для этого должен установитьlogger вlogging.DEBUG уровень, так что обработчики могут фильтровать с этого уровня, в противном случае все происходит изlogging.WARNING уровень по умолчанию.
 19 дек. 2017 г., 13:27
У меня не сработалоAttributeError: 'module' object has no attribute 'handlers'

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

logging.basicConfig(level=logging.DEBUG)

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

Марио

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

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

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

Ваш ответ на вопрос