【问题标题】:Logging within utility classes实用程序类中的日志记录
【发布时间】:2010-03-03 13:19:21
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: perl logging dbi log4perl


    【解决方案1】:

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

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

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

    【讨论】:

    • 对不起,我没看懂第一句话。 “调用者”、“独立于 log4perl 运行模块”是什么意思?你能说得更清楚些吗?
    • 例如在编写测试类时,您可能会创建一些不一定实现 log4perl 的模块 - 您可以简单地跳过它,而如果它是您界面的一部分,您需要添加大量逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    相关资源
    最近更新 更多