在Python中使用" logging"模块,文档承诺LogRecord实例将具有许多属性,这些属性在文档中明确列出。
然而,似乎并非总是如此。当我不使用记录模块' basicConfig()'方法,下面的程序显示属性' asctime'和'消息' LogRecords中没有传递给LogHandler的' emit'方法
import logging
class LoggingHandler(logging.Handler):
def __init__(self):
logging.Handler.__init__(self)
def emit(self, record):
assert isinstance(record, logging.LogRecord)
print("LoggingHandler received LogRecord: {}".format(record))
# List of LogRecord attributes expected when reading the
# documentation of the logging module:
expected_attributes = \
"args,asctime,created,exc_info,filename,funcName,levelname," \
"levelno,lineno,module,msecs,message,msg,name,pathname," \
"process,processName,relativeCreated,stack_info,thread,threadName"
for ea in expected_attributes.split(","):
if not hasattr(record, ea):
print("UNEXPECTED: LogRecord does not have the '{}' field!".format(ea))
loggingHandler = LoggingHandler()
rootLogger = logging.getLogger()
rootLogger.addHandler(loggingHandler)
# emit an WARNING message
logging.warning("WARNING MESSAGE")
在Python 3上运行此命令:
$python3 test_logging.py
LoggingHandler received LogRecord: <LogRecord: root, 30, test_logging.py, 28, "WARNING MESSAGE">
UNEXPECTED: LogRecord does not have the 'asctime' field!
UNEXPECTED: LogRecord does not have the 'message' field!
这里发生了什么?我误解了文档吗?需要做些什么来确保LogRecord实例具有&#39; asctime&#39;和&#39;消息&#39;承诺的属性?
答案 0 :(得分:2)
Formatter
< / a>设置 asctime
和 message
,因此在调用 self.format(record)
之前,这些属性是未定义的。来自 格式
方法:
&#xA;&#xA;&#xA;记录的属性字典用作字符串&#xA;的操作数。格式化操作。返回结果字符串。格式化之前&#xA;在字典中,进行了几个准备步骤。在&#XA;记录的message属性使用msg%args计算。如果&#xA;格式化字符串包含'(asctime)',formatTime()被调用到&#xA;格式化事件时间。
&#xA;
因为您的示例代码没有调用 self.format(record)
因此,期望这些属性未定义的行为。
要消息
和 asctime
设置,您必须首先在 emit
方法中调用 self.format(record)
。请尝试
import logging&#xA;&#xA; class LoggingHandler(logging.Handler):&#xA; def emit(self,record):&#xA;断言isinstance(record,logging.LogRecord)&#xA; print(“LoggingHandler收到LogRecord:{}”。格式(记录))&#xA;&#xA; self.format(记录)&#XA;&#XA; #读取&#xA时预期的LogRecord属性列表#loging module的文档:&#xA;&#xA; expected_attributes = \&#xA; “args,asctime,created,exc_info,filename,funcName,levelname,”\&#xA; “levelno,lineno,module,msecs,message,msg,name,pathname,”\&#xA; “过程中,processName,relativeCreated,stack_info,螺纹,threadName” &#XA;&#XA; for ea in expected_attributes.split(“,”):&#xA;如果不是hasattr(记录,ea):&#xA; print(“UNEXPECTED:LogRecord没有'{}'字段!”。format(ea))&#xA;&#xA;&#xA; formatter = logging.Formatter(“%(asctime)s”)& #xA; loggingHandler = LoggingHandler()&#xA; loggingHandler.setFormatter(formatter)&#xA; rootLogger = logging.getLogger()&#xA; rootLogger.addHandler(loggingHandler)&#xA;&#xA; #evmission a警告消息&#xA; logging.warning(“警告消息”)&#xA;
&#xA;