【问题标题】:Disposing of Log4perl logger when I no longer need it当我不再需要 Log4perl 记录器时处理它
【发布时间】:2011-05-06 16:10:00
【问题描述】:

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

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

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


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

【问题讨论】:

  • DESTROY 方法不应该被手动调用,因为当要从内存中删除对象时,它会被 perl 本身调用。直接调用DESTROY不会释放内存。
  • @Ivan:好吧,废话。非常漂亮的 hack 就这么多。感谢您的提示。
  • Logger 对象是代码引用的小散列。除非您正在制作大量的东西,否则我认为与您的程序存储在内存中的任何实际数据相比,额外的内存是无关紧要的。别担心。

标签: perl log4perl


【解决方案1】:

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

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

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

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

【讨论】:

  • 我已经通过围绕它进行设计来解决问题,但如果我仍然被锁定在原始设计中,这就是我会使用的解决方案。放在我的口袋里是件好事。谢谢! (顺便说一句——我想我们在 RL 中认识。)
【解决方案2】:

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

Checked into github 应该会在下一个版本 (1.33) 中发布。感谢您引起我的注意。你的 log4perl 人,Mike。

【讨论】:

    【解决方案3】:

    看起来像

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

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

    【讨论】:

    • 从轨道上核对站点? :-) 就可以了,但如果我没看错的话,我也想保留任何记录器。
    • @BlairHippo - 确实读错了你的问题,我以为你想完全摆脱 Log::Log4perl。如果你只想删除一些东西,为什么不给它新的配置并让它重新初始化呢?
    • 不幸的是,cleanup() 不仅删除了自己的缓存,还在每个记录器上主动调用 DESTROY。这是不必要的,并且使调用cleanup() 很危险。您必须知道,整个过程中各处的所有记录器,甚至在 3rd 方模块中,都不再使用。
    • 我已经向作者报告了清理攻击行为的问题。 github.com/mschilli/log4perl/issues/7(另外,清理没有记录,所以你不应该使用它)
    【解决方案4】:

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

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

    【讨论】:

    • 嘿。如果您阅读其他答案,则该功能是该问题的结果。我其实有点骄傲。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多