【问题标题】:Python Logging HandlerPython 日志处理程序
【发布时间】:2013-11-27 10:27:28
【问题描述】:

我想使用 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 在我的记录器中有效地添加上下文用户定义的信息。

附:我已经尝试过python doc中给出的方法没有用

【问题讨论】:

    标签: python logging


    【解决方案1】:

    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 属性访问。但是,您想首先实例化一个处理程序(通过 logging.handlers.RotatingFileHandler() )并将此处理程序(fh)与您的记录器(logger.addHandler)一起使用。这样做,您的记录器实例现在知道处理程序:

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

    【讨论】:

      【解决方案2】:

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

      您可能会遇到此问题的另一个原因是如果您忘记了

      import logging.handlers
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 1970-01-01
        相关资源
        最近更新 更多