我是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!!!!
有人可以对第二种情况下发生的事情有所了解吗?
答案 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
模块中的warn
,logging
和其他功能会调用basicConfig
,StreamHandler
会向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()
是一个方便的功能,可以为您提供默认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
答案 3 :(得分:0)
如果在使用sentry(No 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',
}