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

时间:2011-02-07 20:18:06

标签: python logging

我有一个python脚本,它在几个地方调用log.error()和log.exception()。捕获这些异常以便脚本可以继续运行,但是,我希望能够确定是否曾调用log.error()和/或log.exception(),因此我可以使用错误代码退出脚本通过调用sys.exit(1)。下面包括使用“错误”变量的简单实现。在我看来,必须有一个更好的方法。

error = False

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

if error:
   sys.exit(1)

5 个答案:

答案 0 :(得分:2)

我认为您的解决方案不是最佳选择。日志记录是脚本的一个方面,根据控制流程返回错误代码是另一个方面。也许使用例外是一个更好的选择。

但是如果你想跟踪记录的调用,可以将它包装在装饰器中。下面是一个装饰器的简单示例(没有继承或动态属性访问):

class LogWrapper:

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

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

答案 1 :(得分:2)

我遇到了与原始海报相同的问题:如果记录了任何错误或更严重的错误消息,我想用错误代码退出Python脚本。对于我的应用程序,只要没有引发未处理的异常,就可以继续执行。但是,如果记录任何错误,则连续集成构建应该失败。

我找到了errorhandler python包,它正是我们需要的。请参阅GitHubPyPI pagedocs

以下是我使用的代码:

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 :(得分:0)

你可以雇用一个柜台。如果要跟踪单个异常,请创建一个字典,其中异常为键,整数计数器为值。

答案 3 :(得分:0)

您可以检查logger._cache。它返回一个字典,其中包含与记录的错误级别的numeric value相对应的键。因此,要检查是否记录了错误,可以执行以下操作:

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

答案 4 :(得分:0)

无论logger._cache是​​否不是解决方案(当其他包/模块自己登录但不会以logger._cache结尾)时,都有一种方法可以构建ContextFilter来记录最差的日志级别:

class ContextFilterWorstLevel(logging.Filter):
    def __init__(self):
        self.worst_level = logging.INFO
    def filter(self, record):
        if record.levelno > self.worst_level:
            self.worst_level = record.levelno
        return True


# Create a logger object and add the filter     
logger = logging.getLogger()
logger.addFilter(ContextFilterWorstLevel())

# Check the worst log level called later
for filter in logger.filters:
    if isinstance(filter, ContextFilterWorstLevel):
        print(filter.worst_level)