Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我不再需要Log4perl logger时,处理它_Perl_Log4perl - Fatal编程技术网

当我不再需要Log4perl logger时,处理它

当我不再需要Log4perl logger时,处理它,perl,log4perl,Perl,Log4perl,我使用Log4perl作为包的一部分来捕获特定DBI连接正在做什么。我目前的计划是通过Log::Log4perl->get\u logger($mysql\u connect\u id)为每个连接创建一个新的logger对象,它应该允许不同的连接写入不同的文件或同一个文件,而不会相互干扰 我关心的是当连接断开并且不再需要记录器时会发生什么。如果Log4perl只是让这些记录器无限期地存在,那听起来像是内存泄漏的处方 在我确信记录器不再有用之后,最好的方法是什么?或者,反过来说,这甚至是一个问题—

我使用Log4perl作为包的一部分来捕获特定DBI连接正在做什么。我目前的计划是通过
Log::Log4perl->get\u logger($mysql\u connect\u id)
为每个连接创建一个新的logger对象,它应该允许不同的连接写入不同的文件或同一个文件,而不会相互干扰

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

在我确信记录器不再有用之后,最好的方法是什么?或者,反过来说,这甚至是一个问题——Log4perl是否有某种内置的处理机制,可以防止这种泄漏?
编辑:在一个问题的评论中提到,在这里可能值得一提:Log::Log4perl::Logger有一个
DESTROY
方法,看起来很有前途。然而,它没有文档记录,并且抛出了一堆“在字符串eq中使用未初始化值”的警告,这让我很警惕;这感觉像一个黑客。(但如果这是最好/唯一的方法,我想问题是“如何关闭来自特定软件包的特定警告?”)

看起来像

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

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

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

delete $Log::Log4perl::Logger::LOGGERS_BY_NAME->{$category};
这是“安全的”,因为它将与当前版本的Log::Log4perl一起工作,但不安全,因为它可能会在更新中中断。这是另一个SO用户以前建议的,但他们删除了它


我建议您能够将删除单个缓存项作为API的一部分。如果你想加快它,提交一个补丁。很简单。

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

并且应该在下一个版本(1.33)中发布。谢谢你提醒我这件事。你的log4perl助手Mike。

来自以下文档:

要从系统中删除记录器,请使用Log::Log4perl->remove\u logger($logger)。剩余的引用$logger消失后,记录器将自毁。如果所讨论的记录器是隐形记录器,则其所有方便快捷方式(调试、信息等)都将变为无操作


方法不应该手动调用,因为当对象要从内存中删除时,perl本身将调用它。直接调用
DESTROY
不会释放内存。@Ivan:好吧,废话。对于一个非常漂亮的黑客来说就这么多了。感谢您的提示。Logger对象是代码引用的小散列。除非你们正在制造大量的东西,否则我认为额外的内存和你们的程序存储在内存中的实际数据相比是无关紧要的。别担心。从轨道上用核武器炸那个地方?:-)这样就可以了,但如果我读对了,我想留下来的任何伐木工人也会被除掉。@BlairHippo-你的问题读错了,我以为你想彻底除掉Log::Log4perl。如果您只想删除某些内容,为什么不给它一个新的配置并让它自己重新初始化呢?不幸的是,
cleanup()
不仅删除了它自己的缓存,而且在每个记录器上都会主动调用DESTROY。这是不必要的,并且使得调用
cleanup()
非常危险。你必须知道,在整个过程中,任何地方的所有记录器,甚至在第三方模块中,都不再使用。我已经向作者报告了清理的攻击行为问题。(另外,清理没有文档记录,所以你不应该使用它)我通过围绕它进行设计来处理问题,但是如果我仍然被锁定在原始设计中,这就是我会使用的解决方案。我口袋里有这是件好事。谢谢(顺便说一句,我想我们在RL认识。)嘿。如果你阅读了其他答案,那么这个特征就是这个问题的结果。我真的有点骄傲。:-)