没有为记录器找到处理程序

时间:2017-05-25 19:20:15

标签: python logging handler

我是python的新手。我尝试登录python时遇到在尝试通过logger实例打印一些警告时,没有找到记录器错误的处理程序。以下是我试过的代码

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

我收到此错误无法找到记录器“logger”的处理程序

让我感到困惑的是,当我第一次尝试使用logging然后通过logger打印警告时,它可以正常工作,例如

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

有人可以对第二种情况下发生的事情有所了解吗?

4 个答案:

答案 0 :(得分:66)

致电 logging.basicConfig()

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

答案 1 :(得分:14)

要通过logger记录某些消息,在Python中至少应该向logger对象添加一个处理程序。默认情况下,debug模块中的warnlogging和其他功能会调用basicConfigStreamHandler会向root logger添加import logging import inspect print(inspect.getsource(logging))

始终recommended将您需要的处理程序添加到您为模块编写的记录器对象中。

你可以参考official Python docs,它有一个awesome tutorial,或者你可以自己更好地查看记录模块的源代码。

只需通过

检查Python shell本身的源代码即可
basicConfig

最后,明确调用import logging logging.basicConfig() logger = logging.getLogger('logger') logger.warning('The system may break down') 将解决问题。

const initialState = {
    sum: 0,
    denomGroups: [
        {
            coins: [
                { name: 'Penny', namePlural: 'Pennies', label: '1¢', value: .01, sum: 0 },
                { name: 'Nickel', namePlural: 'Nickels', label: '5¢', value: .05, sum: 0 },
                { name: 'Dime', namePlural: 'Dimes', label: '10¢', value: .10, sum: 0 },
                { name: 'Quarter', namePlural: 'Quarters', label: '25¢', value: .25, sum: 0 }
            ]
        },
        {
            bills: [
                { name: 'Dollar', namePlural: 'Dollars', label: '$1', value: 1, sum: 0 },
                { name: 'Five', namePlural: 'Fives', label: '$5', value: 5, sum: 0 },
                { name: 'Ten', namePlural: 'Tens', label: '$10', value: 10, sum: 0 },
                { name: 'Twenty', namePlural: 'Twentys', label: '$20', value: 20, sum: 0 },
                { name: 'Fifty', namePlural: 'Fiftys', label: '$50', value: 50, sum: 0 },
                { name: 'Hundred', namePlural: 'Hundreds', label: '$100', value: 100, sum: 0 }
            ]
        }
    ]
};

答案 2 :(得分:11)

除了博士答案之外,调用logging.basicConfig()是一个方便的功能,可以为您提供默认StreamHandlerFormatter。如果您想快速拥有日志记录功能,那就足够了。您可以通过传递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

答案 3 :(得分:0)

如果在使用sentryNo handlers could be found for logger "sentry.errors")时遇到此错误,则可能是由于SNI支持的哨兵错误。

检查https://github.com/getsentry/raven-python/issues/523了解更多详细信息。一个快速的解决方法是用threaded+requests+https代替DSN方案:

RAVEN_CONFIG = {
    'dsn': 'threaded+requests+https://xxxxxxxxxxxx@sentry.example.com/1',
}