gpt4 book ai didi

Python 日志记录 - exc_info 仅适用于文件处理程序

转载 作者:太空狗 更新时间:2023-10-30 03:07:06 24 4
gpt4 key购买 nike

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

_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 block 中调用 _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

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

最佳答案

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

异常文本缓存在记录中(在属性 exc_text 中):如果这是一个假值(例如空字符串),那么 formatException() 将被调用重新填充它,否则它不会。因此,在您的格式化程序类中,您可能需要覆盖 format() 方法并将 record.exc_text 设置为 false 值,然后再调用父类(super class)的 format() 方法,以确保您重写的 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 ''

关于Python 日志记录 - exc_info 仅适用于文件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6177520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com