【问题标题】:Raising exception during logging在记录期间引发异常
【发布时间】:2021-08-16 00:39:12
【问题描述】:

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

【问题讨论】:

标签: python exception logging


【解决方案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")

【讨论】:

    【解决方案2】:

    您通常不会通过调用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(...)

    【讨论】:

    • 成功了!非常感谢。我用的是简化版,raise MyError(...)
    猜你喜欢
    • 2019-03-11
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2015-11-18
    • 2016-07-14
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多