我不得不扩展现有的日志库来添加一些功能。其中之一是一个功能,它允许处理程序监听任何现有的日志,而无需事先知道它是否存在。下面的代码允许处理程序监听,但不检查日志是否存在:
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
这样的函数,有这样的函数吗?或者有一个方便的解决方法吗?
3条答案
按热度按时间6ojccjat1#
适用于我和您的解决方案:
当您为自己的代码创建日志记录器时,您几乎肯定会创建一个带有处理程序(文件处理程序和/或控制台处理程序)的日志记录器。
那么这个日志记录器还没有处理程序。因此,我总是检查上面的日志记录器是否会导致一个日志记录器有处理程序
因此,我只在根日志记录器没有处理程序时才创建日志记录器:
“create_my_logger”片段表示我的代码/函数,它返回一个记录器(带有处理程序)。
eeq64g8w2#
警告。这没有记录。它可能会改变,恕不另行通知。
logging模块在内部使用一个
Manager
对象将记录器的层次结构保存在一个dict中,可以通过以下方式访问:除根日志记录器外的所有日志记录器都以其名称存储在该dict中。
网上有几个例子:http://code.activestate.com/lists/python-list/621740/和https://michaelgoerz.net/notes/use-of-the-logging-module-in-python.html(使用Python 2打印)
um6iljoc3#
当然,如果您将一个处理程序附加到根日志记录器,您(通常)将获得所有消息(除非库作者特别选择不传播到根处理程序)。
为什么要关心处理程序是否监听了一个还没有创建的日志呢?您可以对处理程序应用过滤器来忽略某些事件。
这并没有具体回答你的问题,因为我把你的问题看作是XY Problem的一个示例。