#python #logging #python-logging
#питон #регистрация #python-ведение журнала
Вопрос:
У меня есть код, который работает, но делает вещи, которые я не понимаю. В этом коде используется logging
модуль python. Проблема в том, что когда я запускаю этот скрипт, на консоли всегда есть (в дополнение к обычному журналу потоков) строка, которая мне не нужна (вторая строка в STDOUT внизу этого поста).
Я не понимаю, почему существует эта линия и как решить эту проблему.
Я думаю, что эта проблема связана с использованием logging.basicConfig(level=logging.INFO)
, но мне нужно ее использовать, потому что, если я ее не использую, logger.info('This is a INFO-01')
не работает только ПРЕДУПРЕЖДЕНИЕ об уровне и т. Д… Я попробовал несколько вещей, но это просто привело к ошибкам и не нашло ответа в Интернете.
import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) c_handler = logging.StreamHandler() f_handler = logging.FileHandler('file07.log') c_handler.setLevel(logging.INFO) f_handler.setLevel(logging.INFO) c_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') f_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') c_handler.setFormatter(c_format) f_handler.setFormatter(f_format) logger.addHandler(c_handler) logger.addHandler(f_handler) logger.info('This is a INFO-01')
ВЫХОД ИЗ СТРОЯ:
2021-12-11 17:54:30,203 - INFO - This is a INFO-01 INFO:__main__:This is a INFO-01
Если кто-нибудь сможет мне помочь, я буду очень благодарен. Сердечно
Комментарии:
1. Вы используете
basicConfig()
, который добавляет обработчик, а затем вручную добавляете дополнительные обработчики. Неудивительно, что ты получаешь реплики не один раз.
Ответ №1:
Вы правильно угадали. Взгляните на это изображение из документации.
По умолчанию распространение равно True
. Таким образом, у вашего logger
объекта есть родительский регистратор с именем «root».
basicConfig
по сути, выполняет базовую настройку системы ведения журнала, создавая StreamHandler
форматер по умолчанию и добавляя его в корневой регистратор.
«Корень» является родителем всех регистраторов. Поэтому после того, как обработчики вашего logger
регистратора обработают сообщение, оно будет передано обработчикам родительского регистратора, и поскольку теперь у него есть обработчик, оно выводит это сообщение во второй раз в формате по умолчанию.
Вы можете удалить это, потому что вам это не нужно. Не забудьте указать УРОВЕНЬ для вашего logger
: (я удалил f_handler
обработчик в приведенном ниже коде)
import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # lt;----- here c_handler = logging.StreamHandler() c_handler.setLevel(logging.INFO) c_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') c_handler.setFormatter(c_format) logger.addHandler(c_handler) logger.info('This is a INFO-01')
Комментарии:
1. Спасибо. Это действительно полезно.