Python日志记录处理程序

问题描述:

我想使用ContextFiltering将一个用户定义的变量添加到记录器格式。我的代码如下:Python日志记录处理程序

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") 

当我不使用的FileHandler,只是使用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文档中给出的方法都没用

变化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") 
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)一起使用。这样做,您的记录器实例现在知道处理程序:

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

对于错别字,感到抱歉。 非常感谢。奇迹般有效 !! –