如何检查记录器是不是存在

Posted

技术标签:

【中文标题】如何检查记录器是不是存在【英文标题】: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这样的功能,有没有这样的功能,或者方便的解决方法?

【问题讨论】:

您可以查看一个字典,请参见此处:code.activestate.com/lists/python-list/621740,但我认为它是无证的。 那太好了,如果您提供答案,我很乐意接受 【参考方案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 的一个实例。

【讨论】:

以上是关于如何检查记录器是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

如何检查Mysql表中是不是存在记录[重复]

如何检查记录是不是已经存在,然后在 laravel 中更新或插入?

如何使用 SQL 检查记录是不是存在?

如何使用 Python MySQdb 检查记录是不是存在

如何检查刀片中是不是存在记录?

Nodejs,AWS Dynamodb如何在创建新记录之前检查用户是不是已经存在