python.logging: Почему мой не базовый параметр конфигурации не работает? - PullRequest
0 голосов
/ 01 июля 2018

Я хочу войти в один файл журнала из основного и всех субмодулей.

Сообщения журнала, отправленные из основного файла, где я определяю регистратор, работают как положено. Но те, которые отправляются из вызова импортированной функции, отсутствуют.

Это работает, если я использую logging.basicConfig, как в примере 1 ниже. Но второй пример, который учитывает больше пользовательских настроек, не работает.

Есть идеи почему?

# in the submodule I have this code
import logging
logger = logging.getLogger(__name__)

ПРИМЕР 1 - Рабочая

Здесь я создаю два обработчика и просто передаю их basicConfig:

# definition of root looger in main module

formatter = logging.Formatter(fmt="%(asctime)s %(name)s.%(levelname)s: %(message)s", datefmt="%Y.%m.%d %H:%M:%S")   

handler = logging.FileHandler('logger.log')
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)

handler2 = logging.StreamHandler(stream=None)
handler2.setFormatter(formatter)
handler2.setLevel(logging.DEBUG)

logging.basicConfig(handlers=[handler, handler2], level=logging.DEBUG)
logger = logging.getLogger(__name__)

ПРИМЕР 2 - Не работает

Здесь я создаю два обработчика и addHandler() отправляем их в корневой логгер:

# definition of root looger in main module

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

handler = logging.FileHandler('logger.log')
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
#handler.setLevel(logging.ERROR)
logger.addHandler(handler)

handler = logging.StreamHandler(stream=None)
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)

1 Ответ

0 голосов
/ 01 июля 2018

Вам необходимо настроить (один-единственный) корневой логгер в главном модуле вашего программного обеспечения. Это делается путем вызова

logger = logging.getLogger() #without arguments

вместо

logger = logging.getLogger(__name__)

(документация Python по ведению журнала)

Во втором примере создается отдельный дочерний регистратор с именем вашего скрипта.

Если в подмодулях не определены обработчики, сообщение журнала передается корневому регистратору для его обработки.

С этим вопросом можно ознакомиться здесь: Python Logging - Как наследовать уровень корневого регистратора и обработчик

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...