Python日志处理程序

时间:2013-11-27 10:27:29

标签: python logging

我想使用ContextFiltering将用户定义的变量添加到记录器格式。我的代码如下:

import logging
import logging.handlers
CMDID='TEST'

class ContextFilter(logging.Filter):
  def filter(self,record):
    record.CMDID=CMDID
    return True

FORMAT='%(asctime)s [%(CMDID)s] - %(message)s'
logger=logging.getLogger("Test")
fh=logger.handlers.RotatingFileHandler("testing.log",maxBytes=1024,backupCount=5)
fh.setlevel(logging.DEBUG)
fh.setFormatter(logging.Formatter(FORMAT))
logger.addHandler(fh)
logger.addFilter(ContextFilter())
logger.warning("WTH")

当我不使用文件处理程序并只使用basicConfig进行格式化时,代码工作正常。但是在添加旋转文件处理程序时,我收到错误

Traceback (most recent call last):
Line 16, in <module>
fh=logger.handlers.RotatingFileHandler("testing.log",maxBytes=1024,backupCount=5)
AttributeError: 'list' object has no attribute 'RotatingFileHandler'

现在我也尝试过使用LoggerAdapters类,但它也会引发奇怪的错误,经过进一步调查后我发现它的文档可能存在一些问题。

任何人都可以帮我解决这个问题,并建议我使用此FileHandler在记录器中有效添加上下文用户定义信息的方法。

P.S。我已经尝试过python doc中给出的方法没有用

2 个答案:

答案 0 :(得分:12)

logger.handlers.更改为logging.handlers.,并注意拼写错误(没有setlevel - 方法,但是setLevel - 方法)。

以下代码可以正常使用:

import logging
import logging.handlers
CMDID='TEST'

class ContextFilter(logging.Filter):
  def filter(self,record):
    record.CMDID=CMDID
    return True

FORMAT='%(asctime)s [%(CMDID)s] - %(message)s'
logger=logging.getLogger("Test")
logger=logging.setLevel(logging.DEBUG)
fh=logging.handlers.RotatingFileHandler("testing.log",maxBytes=1024,backupCount=5)
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter(FORMAT))
logger.addHandler(fh)
logger.addFilter(ContextFilter())
logger.warning("WTH")

说明:记录器实例(logger)可能有多个处理程序,可通过它logger.handlers atrribute访问。但是,您希望首先实例化处理程序(通过logging.handlers.RotatingFileHandler())并将此处理程序(fh)与您的记录器(logger.addHandler)一起使用。执行此操作,您的logger-instance现在知道处理程序:

In [4]: logger.handlers
Out[4]: [<logging.handlers.RotatingFileHandler at 0x3e85b70>]

答案 1 :(得分:1)

这与问题并不完全相关,但想像我这样添加新手,因为这是我搜索问题时的最佳结果。

出现此问题的另一个原因是,如果您忘记了

import logging.handlers