Подтвердить что ты не робот

Запись в Python не выводит ничего

В python script Я пишу, я пытаюсь регистрировать события, используя модуль протоколирования. У меня есть следующий код для настройки моего регистратора:

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 должен выводить сообщение корневого регистратора. Почему моя программа ничего не выводит и как ее исправить?

4b9b3361

Ответ 1

Уровень ведения журнала по умолчанию - предупреждение. Поскольку вы не изменили уровень, уровень корневого регистратора все еще предупреждает. Это означает, что он будет игнорировать любой журнал с уровнем, который ниже, чем предупреждение, включая отладочные записи.

Это объясняется в учебнике:

import logging
logging.warning('Watch out!') # will print a message to the console
logging.info('I told you so') # will not print anything

Строка 'info' ничего не печатает, потому что уровень выше информации.

Чтобы изменить уровень, просто установите его в корневой журнал:

'root':{'handlers':('console', 'file'), 'level':'DEBUG'}

Другими словами, недостаточно определить обработчик с уровнем = DEBUG, фактический уровень ведения журнала должен также быть DEBUG, чтобы заставить его выводить что-либо.

Ответ 2

Спустя много лет, похоже, все еще существует проблема с удобством использования Python logger. Вот некоторые пояснения с примерами:

import logging
# This sets the root logger to write to stdout (your console)
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 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' on it.
# The result is the same.
handle = "my-app"
logger = logging.getLogger(handle)
logger2 = logging.getLogger(handle)  # same as logger

logger.info("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")

Выход:

woot
WARNING:myapp:woot

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

Ответ 3

Может попробовать это? Кажется, проблема решена после удаления всех обработчиков в моем случае.

for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)

logging.basicConfig(filename='output.log', level=logging.INFO)

Ответ 4

Для всех, кто хочет получить очень простой ответ: просто установите желаемый уровень. На вершине всех моих сценариев я просто поставил:

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. По умолчанию установлено значение WARNING.

Это хорошая статья, содержащая эту информацию, выраженную лучше, чем мой ответ:
https://www.digitalocean.com/community/tutorials/how-to-use-logging-in-python-3