LogRecord没有预期的字段

时间:2015-08-30 21:53:03

标签: python logging

在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;承诺的属性?

1 个答案:

答案 0 :(得分:2)

Formatter < / a>设置 asctime message ,因此在调用 self.format(record)之前,这些属性是未定义的。来自 格式 方法:

&#xA;&#xA;
&#xA;

记录的属性字典用作字符串&#xA;的操作数。格式化操作。返回结果字符串。格式化之前&#xA;在字典中,进行了几个准备步骤。在&#XA;记录的message属性使用msg%args计算。如果&#xA;格式化字符串包含'(asctime)',formatTime()被调用到&#xA;格式化事件时间。

&#xA;
&#xA;&#xA;

因为您的示例代码没有调用 self.format(record)因此,期望这些属性未定义的行为。

&#xA;&#xA;

消息 asctime 设置,您必须首先在 emit 方法中调用 self.format(record)。请尝试

&#xA;&#xA;
  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;