Logging.basicConfig в Python не будет работать, если вызов logging.info() перед объявлением

На основании этого ответа Более простой способ включить подробное ведение журнала

Возьмем этот скрипт Python.

import argparse
import logging


def main():
    import argparse
    import logging

    parser = argparse.ArgumentParser(
        description='A test script for http://stackoverflow.com/q/14097061/78845'
    )
    parser.add_argument("-v", "--verbose", help = "increase output verbosity",
                        action = "store_true")

    args = parser.parse_args()
    if args.verbose:
        logging.basicConfig(level=logging.DEBUG)

    logging.info('Shown in debug and info mode')
    logging.debug('Only shown in debug mode')


if __name__ == "__main__":
    logging.info('Starting script!')
    main()

Запуск этого скрипта из терминала как python -m verbose -v ничего не напечатает.

Если вы прокомментируете строку logging.info('Starting script!') из файла, как в

if __name__ == "__main__":
    #logging.info('Starting script!')
    main()

тогда ведение журнала работает, как ожидалось.

Похоже, что попытка вызвать logging.info() до того, как basicConfig будет определена, полностью отключит любое ведение журнала.

Это ошибка в logging или общая ошибка, и почему это происходит?

Я на Python 3.6.7.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 809
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из документации logging: (выделено мной)

 logging.basicConfig(**kwargs)

Does basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger.

The functions debug(), info(), warning(), error() and critical() will call basicConfig() automatically if no handlers are defined for the root logger.

This function does nothing if the root logger already has handlers configured for it.

Таким образом, ваш первый вызов logging.info произвел некоторую автоматическую настройку. Ваша более поздняя попытка настройки не увенчалась успехом из-за уже выполненной автоматической настройки.

Это имеет смысл, спасибо. Не могу сказать, что подавление неудачной попытки повторной инициализации basicConfig полезно. Я проверил добавление logging.warning('Warning') в функцию, и она была напечатана. Я предполагаю, что конфигурация по умолчанию будет регистрировать что-либо более серьезное, чем warning? Сделал несколько тестов и распечатал error и critical. Задокументирована ли она (какой будет эта конфигурация по умолчанию)?

Alex Tereshenkov 30.05.2019 16:00

Можно ли использовать аргумент force=True, чтобы обойти это?

PatrickT 15.05.2020 04:16

хорошо, это объясняет, почему это не работает в функциях GCP!

confiq 29.07.2020 09:42

Не используйте basicConfig для изменения уровня. Используйте logging.getLogger().setLevel(logging.DEBUG), чтобы изменить уровень корневого регистратора. Это можно сделать на любом регистраторе или обработчике.

Другие вопросы по теме