如何检查记录器是否存在

Sha*_*ayn 8 python error-handling logging python-3.x

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

def listen_to_log(target, handler):
    logging.getLogger(target).addHandler(handler)
Run Code Online (Sandbox Code Playgroud)

问题是我不希望任何处理程序侦听未登录的日志,并且希望ValueError在日志不存在时引发 a 。理想情况下,我会执行以下操作:

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

到目前为止,我一直无法找到类似的功能logging.logExists,是否有这样的功能,或方便的解决方法?

Max*_*ant 17

对我和你可能都有效的解决方法:

当您为自己的代码创建记录器时,您几乎肯定会创建一个带有处理程序(文件处理程序和/或控制台处理程序)的记录器。当您尚未创建记录器并且您通过以下方式获得“根”记录器时

logger = logging.getLogger()
Run Code Online (Sandbox Code Playgroud)

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

logging.getLogger().hasHandlers()
Run Code Online (Sandbox Code Playgroud)

因此,仅当根记录器没有处理程序时,我才创建记录器:

logger = <create_my_logger> if not logging.getLogger().hasHandlers() else logging.getLogger()
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您使用的是 &lt; Python 3.2,则可以使用 `len(logger.handlers)` 而不是 `logger.hasHandlers()` (2认同)

VPf*_*PfB 7

警告。这没有记录。它可能会更改,恕不另行通知。

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

import logging
logging.Logger.manager.loggerDict
Run Code Online (Sandbox Code Playgroud)

除根记录之外的所有记录都以其名称存储在该字典中。

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