在 Python 3 中有没有办法在日志记录期间引发异常?我的意思是,我可以以某种方式配置标准 logging
模块以在 logging.error(e)
完成时引发异常吗?
答案 0 :(得分:1)
是的,您可以用自己的方法替换该方法。
import logging
def except_only(msg, *args, **kwargs):
raise Exception(msg)
logging.error = except_only # do not use () here!
logging.error("Log an error")
问题:如果你想记录+异常,你需要记住原来的方法。
import logging
old_logging_error = logging.error # do not use () here!
def new_logging_error(msg, *args, **kwargs):
global old_logging_error
old_logging_error(msg, *args, **kwargs)
raise Exception(msg)
logging.error = new_logging_error # do not use () here!
logging.error("Log an error")
答案 1 :(得分:1)
您通常不会通过调用 logging.error(e)
来记录错误。你通常打电话
logging.error('my message', exc_info=True)
或
logging.error('my message', exc_info=e) # Where e is the exception object
话虽如此,您可以扩展 Logger
类来执行此操作:
from logging import Logger, setLoggerClass
from sys import exc_info
class ErrLogger(Logger):
def error(msg, *args, **kwargs):
super().error(msg, *args, **kwargs)
err = kwargs.get('exc_info')
if not isintsance(err, Exception):
_, err, _ = exc_info()
if err is None:
err = SomeDefaultError(msg) # You decide what to raise
raise err
现在使用 setLoggerClass
函数注册新类:
setLoggerClass(ErrLogger)
使用自定义 error
设置自定义记录器可能比覆盖模块级别 error
更可靠,后者仅在根记录器上运行。
此处显示的方法将按以下顺序引发错误:
exc_info
仅关键字参数传递的错误。SomeDefaultError
是您指定的。如果您想放弃此过程,请将 super().error(msg, *args, **kwargs)
之后的所有内容替换为 raise SomeDefaultError(...)
。