Python日志记录 - 如何检查记录器是否为空

时间:2015-05-05 17:25:30

标签: python logging is-empty

我刚刚在我的应用程序中实现了日志记录,我想知道是否有一种方法来检查记录器是否为空。

我的想法是在我的脚本中设置两个处理程序:

  • 一个用于级别WARNING
  • 的控制台
  • 一个用于级别DEBUG
  • 的文件

在脚本结束时,我需要检查CONSOLE记录器是否为空。这意味着在运行期间,会记录一些level >= WARNING的消息,在这种情况下,我想将调试级别为smtp的日志文件发送到我的邮箱。

是否可以在python脚本本身内进行此检查,而无需将shell重定向到文件?

1 个答案:

答案 0 :(得分:3)

这是一种通用的方法来计算使用装饰器调用函数的次数,您可以查看here

如果你将这个装饰器包装在你感兴趣的类调用中,你可以找出每个成员函数的调用次数,如下所示:

def counted(fn):
    def wrapper(*args, **kwargs):
        wrapper.called += 1
        return fn(*args, **kwargs)
    wrapper.called = 0
    wrapper.__name__ = fn.__name__
    return wrapper

class MyLogger(logging.Logger, object):

    @counted
    def info(self, *args, **kwargs):
        super(MyLogger, self).info(*args, **kwargs)

    @counted
    def warning(self, *args, **kwargs):
        super(MyLogger, self).warning(*args, **kwargs)

接下来,只需设置您的记录器,就像通常那样使用它:

log = my_logger.MyLogger('test_logger')
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
log.addHandler(ch)
log.setLevel(logging.DEBUG)

>>> log.info('no big deal')
no big deal
>>> log.info('harmless message')
harmless message
>>> log.warning('oh no')
oh no

>>> log.info.called
2
>>> log.warning.called
1

你需要装饰你想要计算的所有类,所以异常,调试等。