我正在以文档禁止但未直接引用的方式使用logging.getLogging()。
我的应用程序处理数据文件和网络连接,有时在线程中。为了识别每个连接和/或数据文件的日志行,我执行以下操作:
data_file_name = "data_file_123.xml"
logger = logging.getLogger(data_file_name)
logger.info("This is logged.")
2013-07-22 05:58:55,721 - data_file_123.xml - INFO - This is logged.
这非常有效:
我关注的是http://docs.python.org/2/library/logging.html#logging.getLogger上的文档:
对具有给定名称的此函数的所有调用都返回相同的记录器 实例。这意味着永远不需要传递记录器实例 在应用程序的不同部分之间。
记录器实例是如何销毁的?它们被毁了吗?处理完一百万个文件后,会有一百万个命名的记录器实例在内存中等待使用吗?当内存填满这些旧的日志记录实例时,我是否为内存泄漏做好准备?
答案 0 :(得分:2)
记录器实例是如何销毁的?它们被毁了吗?后 处理一百万个文件将有一百万个命名记录器 在内存中等待使用的实例?我为自己做好了准备 内存是否因内存填充这些旧的日志记录实例而导致内存泄漏?
在解释员退出之前,它们不会被销毁。所有实例都被缓存,因为这是您在记录时所需的行为。处理完一百万个文件后,将一百万个记录器实例。
正如您所说的那样,您正在使用logging
模块来处理不属于模块目标的事物,因此它是次优解决方案。
没有公共API来摆脱缓存记录器,尽管您可以通过执行以下操作来清除缓存:
>>> root = logging.getLogger()
>>> root.manager.loggerDict.clear()
公共文档中未描述loggerDict
或manager
属性,但未将其明确标记为_private
。
不是为每个处理的文件使用不同的记录器,而是为每个线程使用不同的记录器,并在所需的记录消息中插入文件的名称。您可以编写一个简单的函数来执行日志记录,避免在每次调用记录器时显式插入文件名。