Python日志记录 - 仅用于文件处理的exc_info

2024-10-01 09:35:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

和模块记录器实例:

^{pr2}$

现在我在try中调用_log.exception,除了块:

_log.exception("Test")

现在我在控制台和文件中进行回溯。我尝试使用控制台处理程序而不是文件处理程序禁止打印exc_信息:

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

这对文件处理程序和控制台处理程序都有效,对所有处理程序都完全删除了回溯,但我只需要对控制台执行此操作。是否有任何方法只对控制台处理程序而不是文件处理程序取消exc_信息?在

编辑:

我修改_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

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


Tags: 文件logtrue处理程序returnloggingshroot
2条回答

如果先使用该筛选器处理_sh处理程序,则它可能正在修改实际的回溯对象。因为同一个回溯对象同时传递给了_sh和_fh,_fh接收已经修改的回溯。在

您可以在该过滤器中创建一个新的回溯对象sans-exc\u-info,也可以交换顺序,这样addHandler将首先在_-fh上调用。在

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

异常文本缓存在记录中(在属性exc_text)中:如果这是一个假值(例如空字符串),那么将调用formatException()来重新填充它,否则就不会。因此,在formatter类中,在调用超类format()方法之前,可能需要重写format()方法,并将record.exc_text设置为假值,以确保被重写的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 ''

相关问题 更多 >