perl - 在实用程序类中登录

标签 perl logging dbi log4perl

我想在几个实用类中采用日志记录,例如。 G。 DBI。使用 Log::Log4perl 的最佳做法是什么?

我认为子类化 DBI(例如,MyDBI)并覆盖其中的一些方法以使其执行日志记录是可以的。但是类别有问题。如果您使用

创建记录器
Log::Log4perl->get_logger(ref $self || $self)

那么所有的日志条目都属于MyDBI,并且很难过滤它们。所以对我来说,从调用模块(例如,MyModule)向 MyDBI 传递记录器似乎更好,这样该类别在语义上是正确的。第一个问题,一般可以吗?我的意思是,关于这种方法是否有任何隐藏的暗礁?

第二个问题,如何将logger传递给MyDBI?我有一个想法来声明一个全局变量,e。 G。 $MyDBI::logger 并在调用方法中设置:

local $MyDBI::logger = Log::Log4perl->get_logger(ref $self || $self);

传统上不喜欢全局变量。你能想到更好的方法吗?

编辑:当然,最好的代码就是没有代码。如果将继承考虑在内,caller 就足够了。

第三个问题,MyDBIMyModule 这两个类别是否可以使用 Log::Log4perl 登录,如果它们在层次结构上不相关?

最佳答案

我强烈建议您在每个函数或每个模块的单独记录器中独立地记录调用者,这样您就可以独立于调用者使用的 log4perl 运行模块。 每个模块将使用 Log::Log4perl->get_logger("module name") 创建自己的记录器。
如果调用者不创建任何附加程序,程序将不会记录任何内容并且从功能的角度来看,模块中的 log4perl 将被忽略。
Log4Perl 实现了用于创建记录器的单例模式,类似于全局变量。
您的日志记录应该尽可能细粒度,并且根据经验,我会记录调试任何输入参数和函数/方法的任何结果。如果真的有必要,您还可以使用堆栈跟踪找出导致错误情况的调用者。将它添加到参数中只会增加额外的复杂性。

以下秘诀可能会让您对 log4perl 配置方面的灵 active 有更多的了解。 Log4Perl Recipes对我来说,整个想法是保持代码不变,并根据我的实际日志记录/错误跟踪要求(将来可能会改变)更改日志记录配置。尽可能保持代码不变对于模块来说更为重要,因为您希望避免测试所有调用程序。

简要回答您的问题。 1.) 每个模块都应该有自己的记录器 2.) 因此不要将记录器添加到界面中 3.) Log4Perl 将根据您的 appender 配置登录所有级别。通过这种方式,您可以控制您将看到的内容 - 正常级别通常是 INFO,特定模块可能处于调试状态。在糟糕的情况下,模式布局将允许您仅通过配置将堆栈跟踪添加到日志记录中。

关于perl - 在实用程序类中登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2371513/

相关文章:

perl - 为什么 File::Slurp 在应该返回一个列表时返回一个标量?

perl - 按模式过滤文件名

logging - 如何将节点红色控制台日志保存到Docker中的单独日志文件中

ruby - DBI::OperationalError:无法连接到服务器:连接被拒绝

perl - 如何将子例程调用的结果分配给 Perl 中的数组引用?

html - 从 Perl 中的 HTMl/XML 标签中提取文本

sql - 每当 Hibernate 发出 SQL 查询时,如何记录堆栈跟踪?

java - log4j :WARN Please initialize the log4j system properly

perl - DBIx::Class 中的子查询