3

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

我认为继承 DBI(比如,MyDBI)并覆盖那里的一些方法以使它们进行日志记录是可以的。但是分类有问题。如果您创建一个记录器

Log::Log4perl->get_logger(ref $self || $self)

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

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

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

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

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

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

4

1 回答 1

2

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

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

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

于 2010-03-09T08:42:26.657 回答