如何确定Python程序执行期间是否记录了错误?

7 投票
5 回答
4762 浏览
提问于 2025-04-16 11:24

我有一个Python脚本,在多个地方使用了log.error()和log.exception()来记录错误。这些错误会被捕获,这样脚本就可以继续运行。不过,我希望能够知道log.error()和/或log.exception()是否被调用过,这样我就可以通过调用sys.exit(1)来带着错误代码退出脚本。下面是一个简单的实现,使用了一个“error”变量。我觉得应该有更好的方法。

error = False

try:
  ...
except:
   log.exception("Something bad occurred.")
   error = True

if error:
   sys.exit(1)

5 个回答

3

你可以查看 logger._cache。它会返回一个字典,这个字典的键对应的是记录的错误级别的数字值。简单来说,如果你想检查是否记录了一个错误,你可以这样做:

if 40 in logger._cache and logger._cache[40]

7

我遇到了和原帖作者一样的问题:我希望在我的Python脚本中,如果记录了任何错误或更严重的信息,就用一个错误代码退出。对我来说,只要没有未处理的异常,程序就应该继续运行。但是,如果记录了任何错误,持续集成的构建就应该失败。

我找到了一个叫做 errorhandler 的Python包,它正好满足我们的需求。你可以查看它的 GitHub 页面, PyPI页面,以及 文档

下面是我使用的代码:

import logging
import sys

import errorhandler

# Track if message gets logged with severity of error or greater
error_handler = errorhandler.ErrorHandler()

# Also log to stderr
stream_handler = logging.StreamHandler(stream=sys.stderr)
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # Set whatever logging level for stderr
logger.addHandler(stream_handler)

# Do your program here

if error_handler.fired:
    logger.critical('Failure: exiting with code 1 due to logged errors')
    raise SystemExit(1)
2

我觉得你的解决方案不是最好的选择。记录日志是你脚本中的一个方面,而根据控制流程返回错误代码是另一个方面。也许使用异常处理会是个更好的选择。

不过,如果你想跟踪日志的调用,可以把它放在一个装饰器里面。下面是一个简单的装饰器示例(没有继承或动态属性访问):

class LogWrapper:

    def __init__(self, log):
        self.log = log
        self.error = False

    def exception(self, message)
        self.error = True
        self.log.exception(message)

撰写回答