Справка для модуля ведения журнала гласит:
Поведение по умолчанию - создание StreamHandler, который пишет в sys.stderr, установка форматера с использованием строки формата BASIC_FORMAT и добавление обработчика вroot logger.
Как указано в (теперь удаленном) комментарии, это описание относится к basicConfig()
, который действительно вызывается не сразу.Что действительно происходит, так это то, что корневой логгер инициализируется функционально эквивалентным способом, и именно это используется в качестве стандартного логгера.На самом деле он инициализируется в два этапа: во время загрузки модуля инициализируется корневой логгер:
root = RootLogger(WARNING)
Logger.root = root
Logger.manager = Manager(Logger.root)
, но никакой обработчик не подключен:
>>> logging.root.__dict__
{'name': 'root', 'parent': None, 'handlers': [], 'level': 30, 'disabled': 0, 'propagate': 1, 'filters': []}
Когда logging.warning()
(или error()
или info()
или ...) вызывается, вызывается basicConfig()
, который добавляет StreamHandler в sys.stderr:
def warning(msg, *args, **kwargs):
"""
Log a message with severity 'WARNING' on the root logger.
"""
if len(root.handlers) == 0:
basicConfig()
root.warning(msg, *args, **kwargs)
Это python2.7.Я предполагаю, что python3 работает так же, но я не проверял.