Ответ 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))
Это ограничит каждый обработчик записью только сообщений журнала на указанном уровне.