Python的logging.getLogger是否可以使用许多命名记录器进行扩展?

时间:2013-07-22 08:25:10

标签: python logging

我正在以文档禁止但未直接引用的方式使用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.

这非常有效:

  • 避免在软件周围传递记录器实例。
  • 确保每一个 line没有标记适当的源标识符 在每次记录调用中手动执行它。

我关注的是http://docs.python.org/2/library/logging.html#logging.getLogger上的文档:

  

对具有给定名称的此函数的所有调用都返回相同的记录器   实例。这意味着永远不需要传递记录器实例   在应用程序的不同部分之间。

记录器实例是如何销毁的?它们被毁了吗?处理完一百万个文件后,会有一百万个命名的记录器实例在内存中等待使用吗?当内存填满这些旧的日志记录实例时,我是否为内存泄漏做好准备?

1 个答案:

答案 0 :(得分:2)

  

记录器实例是如何销毁的?它们被毁了吗?后   处理一百万个文件将有一百万个命名记录器   在内存中等待使用的实例?我为自己做好了准备   内存是否因内存填充这些旧的日志记录实例而导致内存泄漏?

在解释员退出之前,它们不会被销毁。所有实例都被缓存,因为这是您在记录时所需的行为。处理完一百万个文件后,一百万个记录器实例。

正如您所说的那样,您正在使用logging模块来处理不属于模块目标的事物,因此它是次优解决方案。

没有公共API来摆脱缓存记录器,尽管您可以通过执行以下操作来清除缓存:

>>> root = logging.getLogger()
>>> root.manager.loggerDict.clear()

公共文档中未描述loggerDictmanager属性,但未将其明确标记为_private

不是为每个处理的文件使用不同的记录器,而是为每个线程使用不同的记录器,并在所需的记录消息中插入文件的名称。您可以编写一个简单的函数来执行日志记录,避免在每次调用记录器时显式插入文件名。