【问题标题】:How to check if a logger exists如何检查记录器是否存在
【发布时间】:2019-04-07 08:32:39
【问题描述】:

我不得不扩展现有的日志库以添加一些功能。其中之一是允许处理程序侦听任何现有日志而不事先知道它是否存在的功能。以下允许处理程序进行侦听,但不检查日志是否存在:

def listen_to_log(target, handler):
    logging.getLogger(target).addHandler(handler)

问题是我不希望任何处理程序收听未记录到的日志,并且如果该日志不存在,则希望引发ValueError。理想情况下,我会执行以下操作:

def listen_to_log(target, handler):
    if not logging.logExists(target):
        raise ValueError('Log not found')
    logging.getLogger(target).addHandler(handler)

目前我一直找不到像logging.logExists这样的功能,有没有这样的功能,或者方便的解决方法?

【问题讨论】:

标签: python python-3.x logging error-handling


【解决方案1】:

适用于我和你的解决方法:

当您为自己的代码创建记录器时,您几乎肯定会创建带有处理程序(文件处理程序和/或控制台处理程序)的记录器。 当您还没有创建记录器并且通过

获得“根”记录器时
logger = logging.getLogger()

那么这个记录器将没有处理程序。 因此,我总是检查上面的记录器是否会生成一个有处理程序的记录器

logging.getLogger().hasHandlers()

所以我只在根记录器没有处理程序时才创建记录器:

logger = <create_my_logger> if not logging.getLogger().hasHandlers() else logging.getLogger()

“create_my_logger”sn-p 代表我的代码/函数,它返回一个记录器(带有处理程序)。

【讨论】:

  • 这在并发日志记录中也很有用,因为记录器可以在进程重用中幸存下来。
【解决方案2】:

警告。这没有记录。如有更改,恕不另行通知。

日志记录模块在内部使用单个 Manager 对象将记录器的层次结构保存在一个可访问的字典中:

import logging
logging.Logger.manager.loggerDict

所有记录器除了根记录器都以他们的名字存储在该字典中。

网上有几个例子: http://code.activestate.com/lists/python-list/621740/https://michaelgoerz.net/notes/use-of-the-logging-module-in-python.html(使用 Python 2 打印)

【讨论】:

    【解决方案3】:

    当然,如果您将处理程序附加到根记录器,您将(通常)获得所有消息(除非库作者明确选择不传播到根处理程序)。

    为什么要关心处理程序是否侦听尚未创建的日志?您可以将过滤器应用于忽略某些事件的处理程序。

    这并没有具体回答您的问题,因为我将您的问题视为XY Problem 的一个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多