在记录期间引发异常

时间:2021-05-27 17:49:06

标签: python exception logging

在 Python 3 中有没有办法在日志记录期间引发异常?我的意思是,我可以以某种方式配置标准 logging 模块以在 logging.error(e) 完成时引发异常吗?

2 个答案:

答案 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 更可靠,后者仅在根记录器上运行。

此处显示的方法将按以下顺序引发错误:

  1. 通过 exc_info 仅关键字参数传递的错误。
  2. 当前正在处理的错误。
  3. SomeDefaultError 是您指定的。

如果您想放弃此过程,请将 super().error(msg, *args, **kwargs) 之后的所有内容替换为 raise SomeDefaultError(...)

相关问题