4

我使用 Log4perl 作为包的一部分来捕获特定 DBI 连接正在做什么。我目前的计划是为每个连接创建一个新的记录器对象 via Log::Log4perl->get_logger($mysql_connect_id),它应该允许各种连接写入不同的文件或同一个文件,而不会互相搞砸。

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

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


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

4

4 回答 4

5

我看到的唯一方法是操纵Log::Log4perl::Logger.

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

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

我建议您提出一个功能请求,以删除作为 API 的一部分的单个缓存条目。如果你想加快它,提交一个补丁。这很简单。

于 2011-05-09T07:01:16.710 回答
3

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

签入 github,应该会在下一个版本 (1.33) 中发布。感谢您引起我的注意。你的 log4perl 家伙,迈克。

于 2011-05-22T06:29:39.383 回答
2

看起来像

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

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

于 2011-05-06T17:26:37.863 回答
0

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

要从系统中删除记录器,请使用 Log::Log4perl->remove_logger($logger)。在剩余的参考 $logger 消失后,记录器将自毁。如果有问题的记录器是一个隐身记录器,它的所有便利快捷方式(DEBUG、INFO 等)都将变成无操作。

于 2011-12-02T10:07:24.927 回答