На основании этого ответа Более простой способ включить подробное ведение журнала
Возьмем этот скрипт 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.
Из документации 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
произвел некоторую автоматическую настройку. Ваша более поздняя попытка настройки не увенчалась успехом из-за уже выполненной автоматической настройки.
Можно ли использовать аргумент force=True
, чтобы обойти это?
хорошо, это объясняет, почему это не работает в функциях GCP!
Не используйте basicConfig для изменения уровня. Используйте logging.getLogger().setLevel(logging.DEBUG)
, чтобы изменить уровень корневого регистратора. Это можно сделать на любом регистраторе или обработчике.
Это имеет смысл, спасибо. Не могу сказать, что подавление неудачной попытки повторной инициализации
basicConfig
полезно. Я проверил добавлениеlogging.warning('Warning')
в функцию, и она была напечатана. Я предполагаю, что конфигурация по умолчанию будет регистрировать что-либо более серьезное, чемwarning
? Сделал несколько тестов и распечаталerror
иcritical
. Задокументирована ли она (какой будет эта конфигурация по умолчанию)?