在实用程序类中记录

时间:2010-03-03 13:19:21

标签: perl logging dbi log4perl

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

我认为可以继承DBI(比如MyDBI)并覆盖一些方法来使它们进行日志记录。但是类别存在问题。如果使用

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

然后所有日志条目都属于MyDBI,并且很难过滤它们。因此,从调用模块(例如,MyDBI)将记录器传递给MyModule似乎更好,因此该类别在语义上是正确的。第一个问题,一般来说还可以吗?我的意思是,这种方法有没有隐藏的珊瑚礁?

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

以下配方可能会为您提供有关log4perl配置方面灵活性的更多想法。Log4Perl Recipes我的整个想法是保持代码不变并根据我的实际日志/ bug更改日志记录配置跟踪要求(将来可能会改变)。在可能的情况下保持代码不变对于模块来说更为重要,因为您希望避免测试所有调用程序。

简要回答你的问题。 1.)每个模块都应该有自己的记录器 2.)因此不要将记录器添加到界面中 3.)Log4Perl将根据您的appender配置登录所有级别。这样您就可以控制您将看不到的内容 - 正常级别通常是INFO,特定模块可能在调试中。在错误的情况下,Pattern布局将允许您将堆栈跟踪添加到纯粹使用配置的日志记录中。