Для регистратора не найдено никаких обработчиков

Я новичок в python. Я пытался войти в python, и я наткнулся на Не удалось найти обработчиков ошибок logger при попытке распечатать предупреждение через экземпляр журнала. Ниже приведен код, который я пробовал

import logging
logger=logging.getLogger('logger')
logger.warning('The system may break down')

И я получаю эту ошибку Никакие обработчики не могут быть найдены для logger "logger"

Что меня смущает, когда я сначала пытаюсь напечатать предупреждение с помощью logging, а затем через logger, он отлично работает, например

>>> import logging
>>> logging.warning('This is a WARNING!!!!')
WARNING:root:This is a WARNING!!!!
>>> 
>>> logger.warning('WARNING!!!!')
WARNING:logger:WARNING!!!!

Может кто-то пролить свет на то, что происходит во втором сценарии?

Ответ 1

Для регистрации некоторого сообщения через logger в Python по крайней мере один обработчик должен быть добавлен в объект logger. По умолчанию функции debug, warn и другие функции в модуле logging будут вызывать basicConfig который, в свою очередь, добавит StreamHandler в root logger StreamHandler.

Всегда рекомендуется добавить требуемого обработчика к вашему объекту регистрации, который вы пишете для своего модуля.

Вы можете обратиться к официальным документам Python, в которых есть удивительный учебник, или вы можете лучше проверить исходный код модуля протоколирования.

Просто вы можете проверить источник в оболочке Python,

import logging
import inspect
print(inspect.getsource(logging))

Ответ 2

Вызов logging.basicConfig():

>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger('logger')
>>> logger.warning('The system may break down')
WARNING:logger:The system may break down

Ответ 3

Дополнительно к PHD ответа, вызов logging.basicConfig() является удобная функция, которая поможет вам по умолчанию StreamHandler и Formatter. Этого достаточно, если вы хотите быстро иметь функцию ведения журнала. Вы можете настроить его поведение, передав basicConfig несколько аргументов:

Добавить полезные параметры: выводить временную метку рядом с сообщением

logger = logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

Это должно быть хорошо для большинства потребностей. Если вам нужно больше контролировать конфигурацию, вы можете добавить более сложные способы поведения, указав атрибуты журнала самостоятельно.

Сложный пример: без использования функции basicConfig

import logging
logger = logging.getLogger("mylogger")
streamHandler = logging.StreamHandler()
streamHandler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
streamHandler.setFormatter(formatter)

logger.addHandler(streamHandler)

logger.info("Files copied")
logger.warning("disk quota exceeded")
>> 2017-12-06 11:11:12, 090 - mylogger - INFO Files copied
>> 2017-12-06 11:11:12, 091 - mylogger - WARNING disk quota exceeded

Следующим шагом в более крупной среде будет вывод нового регистратора из ранее созданного, чтобы сначала сохранить форматирование, а также поддерживать "иерархию журналов",

logger2 = logging.getLogger("mylogger.new")
logger2.info("New Logger info")
>> 2017-12-06 11:11:12, 091 - mylogger.new - New logger info

Хорошей ссылкой является кулинарная книга регистрации: https://docs.python.org/2/howto/logging-cookbook.html

Ответ 4

Если вы получите эту ошибку при использовании часового (No handlers could be found for logger "sentry.errors"), это может быть связано с ошибкой No handlers could be found for logger "sentry.errors" для поддержки SNI.

проверьте https://github.com/getsentry/raven-python/issues/523 для получения дополнительной информации. быстрое обходное решение заключается в замене схемы DSN threaded+requests+https:

RAVEN_CONFIG = {
    'dsn': 'threaded+requests+https://[email protected]/1',
}