неожиданный аргумент ключевого слова ‘propagate’

#python #logging

#python #ведение журнала

Вопрос:

Я использую модуль ведения журнала python. Для настройки я пытаюсь создать конфигурационный файл в формате yaml. Но я получаю ошибку

 ValueError: Unable to configure handler 'file_handler': __init__() got an unexpected keyword argument 'propagate'
 

в то время как я смог его использовать logger.propagate = False .
Я слежу за python logging yaml config, где они использовали ту же конфигурацию и смогли ее проанализировать.

Вот как выглядит мой yaml

 version: 1

formatters:
  simple:
    format: "%(asctime)s %(funcName)s %(levelname)s %(message)s"

handlers:
  console:
    class: logging.StreamHandler
    level: INFO
    formatter: simple

  file_handler:
    class: logging.FileHandler
    level: INFO
    filename: test_{}.log
    formatter: simple
    propagate: False

loggers:
  dev:
    handlers: [console, file_handler]
  test:
    handlers: [file_handler]
root:
  handlers: [file_handler]
 

Это ошибка, которую я получаю

  File "/usr/lib/python3.6/logging/config.py", line 565, in configure
    handler = self.configure_handler(handlers[name])
  File "/usr/lib/python3.6/logging/config.py", line 738, in configure_handler
    result = factory(**kwargs)
TypeError: __init__() got an unexpected keyword argument 'propagate'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "logging_manager.py", line 34, in <module>
    LoggingManager()
  File "logging_manager.py", line 24, in __init__
    logging.config.dictConfig(config)
  File "/usr/lib/python3.6/logging/config.py", line 802, in dictConfig
    dictConfigClass(config).configure()
  File "/usr/lib/python3.6/logging/config.py", line 573, in configure
    '%r: %s' % (name, e))
ValueError: Unable to configure handler 'file_handler': __init__() got an unexpected keyword argument 'propagate'
 

чего мне здесь не хватает?

РЕДАКТИРОВАТЬ: я использую среду

 Python 3.6.9 (default, Oct  8 2020, 12:12:24)
[GCC 8.4.0] on linux
 

Комментарии:

1. Python 3.6.9 (default, Oct 8 2020, 12:12:24) [GCC 8.4.0] on linux

Ответ №1:

Propagate — это свойство регистратора, а не обработчика. Вам нужно удалить его оттуда, где он у вас есть, и поместить его в раздел logger:

 loggers:
  dev:
    handlers: [console, file_handler]
    propagate: False <---------------------- HERE for example
  test:
    handlers: [file_handler]
 

Комментарии:

1. Спасибо, это сработало для меня, но ссылка, по которой я поделился с python logging yaml config , они делают это в config. Как это работает для них?

2. Вероятно, это не работает для них, и они не проверяли дважды, что код, который они вставляют в свой учебник, совпадает с тем, что у них есть на их компьютере. Распространение на обработчике явно очень неправильно, поскольку обработчики не являются частью иерархии и могут быть присоединены ко многим регистраторам.