В сценарии Python, который я пишу, я пытаюсь регистрировать события с помощью модуля регистрации. У меня есть следующий код для настройки моего регистратора:
ERROR_FORMAT = "%(levelname)s at %(asctime)s in %(funcName)s in %(filename) at line %(lineno)d: %(message)s"
DEBUG_FORMAT = "%(lineno)d in %(filename)s at %(asctime)s: %(message)s"
LOG_CONFIG = {'version':1,
'formatters':{'error':{'format':ERROR_FORMAT},
'debug':{'format':DEBUG_FORMAT}},
'handlers':{'console':{'class':'logging.StreamHandler',
'formatter':'debug',
'level':logging.DEBUG},
'file':{'class':'logging.FileHandler',
'filename':'/usr/local/logs/DatabaseUpdate.log',
'formatter':'error',
'level':logging.ERROR}},
'root':{'handlers':('console', 'file')}}
logging.config.dictConfig(LOG_CONFIG)
Когда я пытаюсь запустить logging.debug("Some string")
, я не получаю вывода на консоль, хотя на этой странице в документации говорится, что logging.debug
корневой регистратор должен выводить сообщение. Почему моя программа ничего не выводит и как это исправить?
level != NOTSET
или корня (если ничего не найдено). ПоWARNING
умолчанию у корня есть уровень. Это написано в разделе, на который вы указали (Logger.setLevel
).logging
нужноlogging.basicConfig()
хотя бы один раз позвонить . В противном случае вы можете быть сильно удивлены, что дочерние регистраторы ничего не будут печатать. Функции регистрации в корневом регистраторе вызывают его лениво.Много лет спустя, похоже, все еще существует проблема с удобством использования регистратора Python. Вот некоторые пояснения с примерами:
import logging # This sets the root logger to write to stdout (your console). # Your script/app needs to call this somewhere at least once. logging.basicConfig() # By default the root logger is set to WARNING and all loggers you define # inherit that value. Here we set the root logger to NOTSET. This logging # level is automatically inherited by all existing and new sub-loggers # that do not set a less verbose level. logging.root.setLevel(logging.NOTSET) # The following line sets the root logger level as well. # It's equivalent to both previous statements combined: logging.basicConfig(level=logging.NOTSET) # You can either share the `logger` object between all your files or the # name handle (here `my-app`) and call `logging.getLogger` with it. # The result is the same. handle = "my-app" logger1 = logging.getLogger(handle) logger2 = logging.getLogger(handle) # logger1 and logger2 point to the same object: # (logger1 is logger2) == True # Convenient methods in order of verbosity from highest to lowest logger.debug("this will get printed") logger.info("this will get printed") logger.warning("this will get printed") logger.error("this will get printed") logger.critical("this will get printed") # In large applications where you would like more control over the logging, # create sub-loggers from your main application logger. component_logger = logger.getChild("component-a") component_logger.info("this will get printed with the prefix `my-app.component-a`") # If you wish to control the logging levels, you can set the level anywhere # in the hierarchy: # # - root # - my-app # - component-a # # Example for development: logger.setLevel(logging.DEBUG) # If that prints too much, enable debug printing only for your component: component_logger.setLevel(logging.DEBUG) # For production you rather want: logger.setLevel(logging.WARNING)
Обычный источник путаницы - плохо инициализированный корневой регистратор. Учти это:
import logging log = logging.getLogger("myapp") log.warning("woot") logging.basicConfig() log.warning("woot")
Выход:
В зависимости от среды выполнения и уровней ведения журнала первая строка журнала (до базовой конфигурации) может нигде не отображаться .
источник
logging.basicConfig( filename='logging.txt', level=logging.DEBUG) logger = logging.getLogger() logger.info('Test B') logging.info('Test A')
logger = logging.getLogger()
, уровень устанавливается на ПРЕДУПРЕЖДЕНИЕ, хотя я указал уровень какDEBUG
. Вы знаете, что я делаю не так?Для тех, кто хочет получить супер-простой ответ: просто установите желаемый уровень отображения. Вверху всех своих скриптов я просто поставил:
import logging logging.basicConfig(level = logging.INFO)
Затем, чтобы отобразить что-либо на этом уровне или выше:
logging.info("Hi you just set your fleeb to level plumbus")
Это иерархический набор из пяти уровней, поэтому журналы будут отображаться на установленном вами уровне или выше . Поэтому, если вы хотите отобразить ошибку, вы можете использовать
logging.error("The plumbus is broken")
.Уровни, в порядке возрастания степени тяжести, являются
DEBUG
,INFO
,WARNING
,ERROR
иCRITICAL
. По умолчанию установленоWARNING
.Это хорошая статья, в которой эта информация выражена лучше, чем мой ответ:
https://www.digitalocean.com/community/tutorials/how-to-use-logging-in-python-3
источник
Может попробовать это? Кажется, проблема решена после удаления всех обработчиков в моем случае.
for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) logging.basicConfig(filename='output.log', level=logging.INFO)
источник
SyntaxError: invalid syntax