Подтвердить что ты не робот

Только определенный уровень регистрации на python

Я регистрирую события в моем коде python, используя модуль регистрации python. У меня есть 2 файла регистрации, которые я тоже хочу зарегистрировать, один из которых содержит информацию о пользователе, а другой - более подробный файл журнала для разработчиков. Я установил два файла регистрации на требуемые уровни (usr.log = INFO и dev.log = ERROR), но не могу определить, как ограничить ведение журнала в файле usr.log, так что записываются только журналы уровня INFO в файл журнала, в отличие от INFO plus, еще выше, например, INFO, WARNING, ERROR и CRITICAL.

Это в основном мой код: -

import logging

logger1 = logging.getLogger('')
logger1.addHandler(logging.FileHandler('/home/tmp/usr.log')
logger1.setLevel(logging.INFO)
logger2 = logging.getLogger('')
logger2.addHandler(logging.FileHandler('/home/tmp/dev.log')
logger2.setLevel(logging.ERROR)

logging.critical('this to be logged in dev.log only')
logging.info('this to be logged to usr.log and dev.log')
logging.warning('this to be logged to dev.log only')

Любая помощь будет большой благодарностью.

4b9b3361

Ответ 1

Я согласен с Дэвидом, но я думаю, что еще нужно сказать. Перефразировать Принцесса Невеста - Я не думаю, что этот код означает то, что вы думаете, что это значит. В вашем коде:

logger1 = logging.getLogger('')
...
logger2 = logging.getLogger('')

что означает, что logger1 и logger2 являются одним и тем же журналом, поэтому, когда вы устанавливаете уровень logger2 в ERROR, вы фактически устанавливаете уровень logger1 одновременно. Чтобы получить два разных регистратора, вам нужно будет указать два разных имени регистратора. Например:

logger1 = logging.getLogger('user')
...
logger2 = logging.getLogger('dev')

Хуже того, вы вызываете методы ведения журнала critical(), info() и warning() и ожидаете, что оба регистратора получат сообщения. Это работает только потому, что вы использовали пустую строку как имя для logger1 и logger2, и, следовательно, они не только одни и те же журналы, они также являются корневым регистратором. Если вы используете разные имена для двух журналов, как я предложил, вам необходимо вызвать методы critical(), info() и warning() для каждого регистратора отдельно (т.е. вам понадобятся два вызова, а не только один).

Я думаю, что вы действительно хотите иметь два разных обработчика на одном регистраторе. Например:

import logging

mylogger = logging.getLogger('mylogger')
handler1 = logging.FileHandler('usr.log')
handler1.setLevel(logging.INFO)
mylogger.addHandler(handler1)
handler2 = logging.FileHandler('dev.log')
handler2.setLevel(logging.ERROR)
mylogger.addHandler(handler2)
mylogger.setLevel(logging.INFO)

mylogger.critical('A critical message')
mylogger.info('An info message')

После того, как вы внесете это изменение, вы можете использовать фильтры, как уже упоминал Дэвид. Здесь фильтр быстрой выборки:

class MyFilter(object):
    def __init__(self, level):
        self.__level = level

    def filter(self, logRecord):
        return logRecord.levelno <= self.__level

Вы можете применить фильтр к каждому из двух обработчиков, например:

handler1.addFilter(MyFilter(logging.INFO))
...
handler2.addFilter(MyFilter(logging.ERROR))

Это ограничит каждый обработчик записью только сообщений журнала на указанном уровне.

Ответ 2

Во-первых: это довольно странная вещь, которую нужно делать, и нападает на меня как небольшое злоупотребление системой регистрации. Я не могу представить себе ситуации, в которой имеет смысл уведомлять пользователя о нормальной работе программы, но не о вещах, которые важнее. Уровни лесозаготовок должны использоваться для указания важности; если у вас есть сообщения, представляющие интерес для разработчиков, вы должны использовать какой-то другой механизм для их различения (например, какой регистратор вы отправляете).

Таким образом, вы можете реализовать произвольную фильтрацию записей журнала, создав подкласс Filter, метод Filter реализует ваши желаемые критерии и установите его на соответствующий обработчик.