Правильное использование nullHandler для отключения регистрации сообщений из определенного пакета

Я хочу остановить внешний модуль для заполнения моего файла журнала, как в этом вопросе: Отключить ведение журнала для определенного пакета Файл конфигурации, вдохновленный ответом, приведен ниже. Я использую питон3.2

Моя проблема в том, что это не работает: строка «handlers=nullHandler» вызывает это:

Traceback (most recent call last):
  File "./tree_browser", line 44, in <module>
    logging.config.fileConfig('../log/logging.conf')
  File "/usr/lib/python3.2/logging/config.py", line 79, in fileConfig
    _install_loggers(cp, handlers, disable_existing_loggers)
  File "/usr/lib/python3.2/logging/config.py", line 202, in _install_loggers
    log.addHandler(handlers[hand])
KeyError: 'nullHandler'

И я не нахожу способа использовать этот nullHandler. Файл конфигурации:

[loggers]
keys=root,RPIO

[handlers]
keys=fileHandler

[formatters]
keys=defaultFormatter

[logger_root]
level=DEBUG
handlers=fileHandler

[logger_RPIO]
level=NOTSET
handlers=nullHandler
qualname=_RPIO.py
propagate=0

[handler_nullHandler]
class=NullHandler
level=DEBUG

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=defaultFormatter
filemode=w
args=('../log/pilberry_core.log',)

[formatter_defaultFormatter]
format=%(asctime)s %(filename)s: %(funcName)s: %(message)s
datefmt=%Y/%m/%d %H:%M:%S

Другие неудачные попытки: пробовали без определения [handler_nullHandler], используя либо nullHandler, либо NullHandler в качестве средства форматирования, это всегда терпит неудачу одинаково.

Обратите внимание, что если я отключу RPIO_logger (путем удаления RPIO из разделов ключей [loggers]), то все остальное будет работать нормально.

Итак, как правильно использовать nullHandler?


person zezollo    schedule 10.08.2014    source источник
comment
После того, как я получил аналогичную ошибку, мне также пришлось указать args=() в конфигурации обработчика, а уровень не нужен.   -  person kon psych    schedule 25.04.2016


Ответы (1)


В разделе handlers вы указываете только fileHandler. Итак, когда вы читаете эту конфигурацию, она создает словарь handlers только с fileHandler. Итак, когда вы пытаетесь использовать nullHandler, вы получаете KeyError, потому что его нет в словаре.

Я предполагаю, что это была простая опечатка, но если нет, см. Формат файла конфигурации в документации:

Файл должен содержать разделы с именами [регистраторы], [обработчики] и [форматтеры], которые идентифицируют по имени сущности каждого типа, определенные в файле. Для каждого такого объекта существует отдельный раздел, в котором указано, как этот объект настроен.

Другими словами, просто наличие раздела handler_nullHandler не создает обработчик с именем nullHandler; наличие keys=…,nullHandler,… в разделе handlers делает это.

person abarnert    schedule 10.08.2014
comment
Как добавление нулевого обработчика в дочерний регистратор предотвращает отображение сообщений журнала корневым регистратором? - person variable; 21.10.2019