我想使用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")
Run Code Online (Sandbox Code Playgroud)
当我不使用文件处理程序并只使用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'
Run Code Online (Sandbox Code Playgroud)
现在我也尝试过使用LoggerAdapters类,但它也会引发奇怪的错误,在进一步调查中我发现它的文档可能存在一些问题.
任何人都可以帮我解决这个问题,并建议我使用这个FileHandler在我的记录器中有效地添加上下文用户定义的信息.
PS我已经尝试过python doc中给出的方法没有用
dor*_*vak 14
更改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")
Run Code Online (Sandbox Code Playgroud)
说明:logger-instance(logger)可能有多个处理程序,可通过它的logger.handlersatrribute 访问.但是,您希望首先(通过logging.handlers.RotatingFileHandler())实例化处理程序并将此处理程序(fh)与您的记录器(logger.addHandler)一起使用.这样做,你的logger-instance现在知道了这个处理程序:
In [4]: logger.handlers
Out[4]: [<logging.handlers.RotatingFileHandler at 0x3e85b70>]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10846 次 |
| 最近记录: |