如何解决更改一个处理程序的日志记录格式会更改所有处理程序
我想将记录器流式传输到多个流。更改标准格式有效,但更改 formatException
函数会改变所有内容!
不确定它是否是一个功能,我误解了一些东西。
见下面的例子,我使用标准的 logging.Formatter 和一个带有 limit
变量的修改:
import logging,io,traceback
class TermFormatter(logging.Formatter):
def __init__(self,*args,stack_limit=1,**kwargs):
super().__init__(*args,**kwargs)
self.stack_limit = stack_limit
def formatException(self,ei):
"""
Format and return the specified exception information as a string.
This default implementation just uses
traceback.print_exception()
"""
sio = io.StringIO()
tb = ei[2]
# See issues #9427,#1553375. Commented out for now.
#if getattr(self,'fullstack',False):
# traceback.print_stack(tb.tb_frame.f_back,file=sio)
traceback.print_exception(ei[0],ei[1],tb,self.stack_limit,sio)
s = sio.getvalue()
sio.close()
if s[-1:] == "\n":
s = s[:-1]
if self.stack_limit ==0:
return "Hello my friend!"
else:
return s
stream_handler = logging.StreamHandler()
stream_handler.terminator = " \n"
formatter0 = TermFormatter("F1 %(asctime)s [%(levelname)s]: %(message)s",stack_limit=2)
stream_handler.setFormatter(formatter0)
stream_handler.setLevel(logging.ERROR)
#check the internals of the err logging
stream_handler2 = logging.StreamHandler()
stream_handler2.terminator = " \n"
formatter = TermFormatter("F2 %(asctime)s [%(levelname)s]: %(message)s",stack_limit=0)
stream_handler2.setFormatter(formatter)
stream_handler2.setLevel(logging.DEBUG)
term_handler = logging.StreamHandler()
term_handler.setFormatter(logging.Formatter("F3 %(asctime)s [%(levelname)s]: %(message)s"))
term_handler.setLevel(logging.DEBUG)
logger= logging.getLogger()
logger.addHandler(stream_handler2)
logger.addHandler(stream_handler)
logger.addHandler(term_handler)
logger.error('wow!')
try:
raise Exception('oh bad')
except:
logger.exception("very ugly")
输出:
F2 2021-07-04 14:16:42,889 [ERROR]: wow!
F1 2021-07-04 14:16:42,889 [ERROR]: wow!
F3 2021-07-04 14:16:42,889 [ERROR]: wow!
F2 2021-07-04 14:16:42,890 [ERROR]: very ugly
Hello my friend!
F1 2021-07-04 14:16:42,890 [ERROR]: very ugly
Hello my friend!
F3 2021-07-04 14:16:42,890 [ERROR]: very ugly
Hello my friend!
我希望在最后三个日志中:对于 F1,堆栈跟踪限制为 2,对于 F2,显示的是什么,对于 F3,完整的堆栈跟踪是默认行为。我在所有情况下都是第二种情况。
解决方法
此处记录了此行为的原因:
https://docs.python.org/3/library/logging.html?highlight=exc_text#logging.Formatter.format
"请注意,格式化的异常信息缓存在属性 exc_text 中。这很有用,因为异常信息可以被腌制并通过网络发送,但如果您有多个自定义格式化的 Formatter 子类,则应小心异常信息。在这种情况下,您必须在格式化程序完成格式化后清除缓存值,以便下一个处理事件的格式化程序不使用缓存值而是重新计算它。"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。