【问题标题】:How to catch errors that were only logged?如何捕获仅记录的错误?
【发布时间】:2020-05-15 08:21:09
【问题描述】:

主要问题

我正在使用一个依赖于日志记录而不是引发错误消息的模块。如何从 Python 中捕获记录的错误以对其做出反应(无需剖析日志文件)?

小例子

假设logging_module.py 看起来像这样:

import logging
import random

def foo():
    logger = logging.getLogger("quz")
    if random.choice([True,False]):
        logger.error("Doooom")

如果这个模块使用了异常,我可以这样做:

from logging_module import foo, Doooom

try:
    foo()
except Doooom:
    bar()

假设logging_module 是这样写的并且我无法更改它,这是不可能的。我能做些什么呢?

到目前为止我的考虑

我浏览了logging documentation(虽然我没有阅读每一个字),但访问记录的唯一方法似乎是剖析实际日志,这对我来说似乎过于乏味(但我可能误解了这一点) .

【问题讨论】:

    标签: python logging error-handling


    【解决方案1】:

    您可以将过滤器添加到模块用于检查每个日志的记录器。 documentation 在使用过滤器时有这样的说法:

    虽然过滤器主要用于过滤基于更多信息的记录 比水平更复杂的标准,他们可以看到每条记录 由它们所附加的处理程序或记录器处理:这可以是 如果你想做一些事情,比如计算有多少条记录,这很有用 由特定的记录器或处理程序处理

    下面的代码假定您正在使用您在问题中显示的logging_module,并尝试模拟try-except 的作用:即,当在foo 函数@987654324 的调用中发生错误时@ 被调用。

    import logging
    
    from logging_module import foo
    
    def bar():
        print('error was logged')
    
    def filt(r):
        if r.levelno == logging.ERROR:
            bar()
        return True
    
    logger = logging.getLogger('quz')
    logger.addFilter(filt)
    
    foo() # bar will be called if this logs an error
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 2014-09-03
      相关资源
      最近更新 更多