【问题标题】:Python logging - exc_info only for file handlerPython 日志记录 - exc_info 仅用于文件处理程序
【发布时间】:2011-05-30 14:28:14
【问题描述】:

我为它定义了根记录器和处理程序:

_root = logging.getLogger()
_sh = logging.StreamHandler()
_fh = logging.FileHandler('./error.log', delay = True)
_root.addHandler(_sh)
_root.addHandler(_fh)

和模块记录器实例:

_log = logging.getLogger("Main")
# In other file
_log = logging.getLogger("Configuration")

现在我在 try..except 块中调用_log.exception

_log.exception("Test")

现在我在控制台和文件中获得回溯。我尝试使用控制台处理程序抑制 exc_info 的打印,但不使用文件处理程序:

class _TraceBackFilter(logging.Filter):
    def filter(self, rec):
        rec.exc_info = None
        return True
_sh = logging.StreamHandler()
_sh.addFilter(_TraceBackFilter())
_root.addHandler(_sh)

这适用于文件和控制台处理程序,所有处理程序的回溯已完全删除,但我只需要控制台。有什么方法可以只为控制台处理程序而不是文件处理程序抑制 exc_info?

编辑:

我修改_TraceBackFilter类。

class _TraceBackFilter(logging.Filter):
    def filter(self, rec):
        if rec.exc_info:
            logging.getLogger(rec.name).log(rec.levelno, rec.getMessage())
            return False
        else:
            return True

现在它适用于控制台处理程序,但在文件中我将消息加倍,一个有回溯,一个没有回溯。

【问题讨论】:

    标签: python logging


    【解决方案1】:

    为您的控制台处理程序创建一个logging.Formatter 子类,该子类从其formatException 方法返回一个空字符串。

    异常文本缓存在记录中(在属性exc_text中):如果这是一个错误值(例如空字符串),则将调用formatException()重新填充它,否则不会。因此,在您的格式化程序类中,您可能需要在调用超类的 format() 方法之前覆盖 format() 方法并将 record.exc_text 设置为 false 值,以确保调用覆盖的 formatException()。例如(未测试):

    class NoExceptionFormatter(logging.Formatter):
        def format(self, record):
            record.exc_text = '' # ensure formatException gets called
            return super(NoExceptionFormatter, self).format(record)
    
        def formatException(self, record):
            return ''
    

    【讨论】:

      【解决方案2】:

      如果 _sh 处理程序首先使用该过滤器进行处理,它看起来可能正在修改实际的回溯对象。因为相同的回溯对象被传递给 _sh 和 _fh,_fh 接收到已经修改的回溯。

      您可以在该过滤器中创建一个新的回溯对象,没有 exc_info,或者只是交换顺序,以便首先在 _fh 上调用 addHandler。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-27
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        相关资源
        最近更新 更多