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

qwe*_*rty 56 python logging handler

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

import logging
logger=logging.getLogger('logger')
logger.warning('The system may break down')
Run Code Online (Sandbox Code Playgroud)

我收到此错误没有找到记录器"logger"的处理程序

令我困惑的是,当我第一次尝试使用logging然后通过打印警告时logger,它工作得很好,就像

>>> import logging
>>> logging.warning('This is a WARNING!!!!')
WARNING:root:This is a WARNING!!!!
>>> 
>>> logger.warning('WARNING!!!!')
WARNING:logger:WARNING!!!!
Run Code Online (Sandbox Code Playgroud)

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

phd*_*phd 70

调用logging.basicConfig():

>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger('logger')
>>> logger.warning('The system may break down')
WARNING:logger:The system may break down
Run Code Online (Sandbox Code Playgroud)

  • 因为`logging.warning()`调用`logging.basicConfig()`如果取消配置日志记录. (5认同)

pra*_*890 19

为了记录一些消息logger,在Python中至少应该向logger对象添加一个处理程序.默认情况下debug,warn在和其他功能logging模块将调用basicConfig这反过来将增加StreamHandlerroot logger.

始终建议将所需的处理程序添加到您为模块编写的记录器对象中.

您可以参考官方Python文档,它有一个很棒的教程,或者您可以自己更好地查看日志模块的源代码.

您只需在Python shell中检查源代码,

import logging
import inspect
print(inspect.getsource(logging))
Run Code Online (Sandbox Code Playgroud)


use*_*754 13

除了phd的答案,调用logging.basicConfig()是一个方便的功能,它将获得默认值StreamHandlerFormatter.如果您想快速拥有日志记录功能,那就足够了.您可以通过传递basicConfig一些参数来自定义它的行为:

添加有用的参数:在消息旁边输出时间戳

logger = logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
Run Code Online (Sandbox Code Playgroud)

对于大多数一次性需求,这应该没问题.如果您需要对配置进行更多控制,可以通过定义记录器的属性来添加更复杂的行为.

复杂的例子:不使用该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
Run Code Online (Sandbox Code Playgroud)

更大环境中的下一步是从先前创建的记录器中获取新记录器,首先保持格式化以及维护"日志层次结构"

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

一个很好的参考是日志食谱: https ://docs.python.org/2/howto/logging-cookbook.html