Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定python程序';谁来执行?_Python_Logging - Fatal编程技术网

如何确定python程序';谁来执行?

如何确定python程序';谁来执行?,python,logging,Python,Logging,我有一个python脚本,它在几个地方调用log.error()和log.exception()。捕获这些异常是为了使脚本能够继续运行,但是,我希望能够确定是否调用过log.error()和/或log.exception(),以便通过调用sys.exit(1)以错误代码退出脚本。下面包含了一个使用“error”变量的简单实现。在我看来,一定有更好的办法 error = False try: ... except: log.exception("Something bad occurr

我有一个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)

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

但是,如果您想跟踪对日志的调用,可以将其包装在装饰器中。下面是一个简单的装饰器示例(无继承或动态属性访问):


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

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

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

下面是我使用的代码:

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)

您可以检查记录器。\u缓存。它返回一个字典,其中的键与记录的错误级别对应。因此,为了检查是否记录了错误,您可以执行以下操作:


如果40在logger中。\u cache和logger.\u cache[40]

无论何时logger.\u cache不是一个解决方案(当其他包/模块自己登录而不会在logger中结束时)。\u 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)

你确定这是个好主意?引发异常的潜在原因有很多,其中最少的一个是带错误代码退出的原因。也。如果是严重错误,只需打印错误消息,并在出现错误时退出即可。这是一个非常优雅的解决方案;)回答得好!不幸的是,它不适用于自己登录的模块,所以我做了一个ContextFilter,我在这里回答了。哦,太糟糕了,很高兴知道。谢谢。这与使用Daniel的回答中提到的errorhandler包相比如何?“这似乎要轻得多,但我不太熟悉装饰器,也不太熟悉使用这些装饰器与errorhandler子类的比较。我强烈建议不要使用这种方法,因为它的实现非常繁琐,而且非常容易出错。
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)