Для регистратора не найдено никаких обработчиков
Я новичок в 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',
}