当我不再需要它时处置Log4perl记录器

时间:2011-05-06 16:10:00

标签: perl log4perl

我正在使用Log4perl作为程序包的一部分来捕获特定DBI连接正在执行的操作。我目前的计划是通过Log::Log4perl->get_logger($mysql_connect_id)为每个连接创建一个新的记录器对象,这应该允许各种连接写入不同的文件或相同的文件,而不会互相阻塞。

我关注的是当连接断开并且不再需要记录器时会发生什么。如果Log4perl只是无限期地保存这些记录器,那听起来像是内存泄漏的秘诀。

在我确定它不再有用之后,摆脱记录器的最佳方法是什么?或者,相反,这甚至是一个问题 - Log4perl是否有某种内置的处理机制,已经防止了这种泄漏?

<小时/> 编辑:在一个问题的评论中提到,这里可能值得一提:Log :: Log4perl :: Logger有一个DESTROY方法似乎很有希望。但是,它没有记录,并且引发了一堆“在字符串eq中使用未初始化的值”警告,这让我很谨慎;感觉就像一个黑客。 (但如果这是最佳/唯一的方法,我想问题是“如何关闭来自特定包裹的特定警告?”

4 个答案:

答案 0 :(得分:5)

我看到的唯一方法是操纵Log::Log4perl::Logger的内部缓存。

delete $Log::Log4perl::Logger::LOGGERS_BY_NAME->{$category};

这是“安全的”,因为它可以使用当前版本的Log :: Log4perl,但不安全,因为它可能会破坏更新。这是之前由另一个SO用户建议的,但他们删除了它。

我建议您make a feature request能够删除单个缓存条目作为API的一部分。如果您想加快它,请提交补丁。这很简单。

答案 1 :(得分:3)

抱歉延迟,我想我现在终于解决了。您现在可以使用新实现的方法Log::Log4perl->remove_logger($logger)来删除未使用的记录器(不要忘记查看您持有的$logge r的剩余引用。)

Checked into github并且应该与下一个版本(1.33)一起发布。谢谢你引起我的注意。你的log4perl家伙,迈克。

答案 2 :(得分:2)

看起来像是

Log::Log4perl::Logger->cleanup();

调用应删除到目前为止已初始化的所有内容。它应该删除任何相关的资源。

答案 3 :(得分:0)

来自http://search.cpan.org/dist/Log-Log4perl/lib/Log/Log4perl.pm的文档:

  

要从系统中删除记录器,请使用Log :: Log4perl-&gt; remove_logger($ logger)。在剩余的引用$ logger消失后,记录器将自毁。如果有问题的记录器是隐形记录器,它的所有便利快捷方式(DEBUG,INFO等)将变为无操作。