如何解决Python记录-仅用于文件处理程序的exc_info
| 我为此定义了根记录器和处理程序:_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
现在,它适用于控制台处理程序,但是在文件中,我已将消息加倍,一个带回溯,一个不带回溯。
解决方法
为控制台处理程序创建一个
logging.Formatter
子类,该子类从其formatException
方法返回一个空字符串。
异常文本被缓存在记录中(属性“ 9”):如果这是一个错误值(例如空字符串),则将调用“ 10”来重新填充它,否则将不会。因此,在格式化程序类中,您可能需要覆盖format()
方法并将record.exc_text
设置为错误值,然后才能调用超类的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 \'\'
, 如果先使用该过滤器处理_sh处理程序,则看起来好像正在修改实际的回溯对象。因为相同的回溯对象同时传递给_sh和_fh,所以_fh接收已修改的回溯。
您可以在该过滤器中创建一个新的追溯对象,无exc_info,也可以只是交换顺序,以便首先在_fh上调用addHandler。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。