代码之家  ›  专栏  ›  技术社区  ›  codeholic

在实用程序类中日志记录

  •  3
  • codeholic  · 技术社区  · 15 年前

    我想在几个实用程序类中采用日志记录,例如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 如果考虑到继承权的话就足够了。

    第三个问题,是否可以同时登录这两个类别, MyDBI公司 我的模块 ,如果它们在层次结构上不相关,则使用Log::Log4perl?

    1 回复  |  直到 15 年前
        1
  •  2
  •   weismat    15 年前

    我强烈建议您在每个函数或每个模块的单独记录器中独立地登录调用者,这样您就可以独立于调用者中使用的log4perl运行您的模块。 每个模块将创建自己的记录器 Log::Log4perl->get_logger("module name")
    如果调用者没有创建任何appender,程序将不会记录任何内容,模块中的log4perl将从功能的角度被忽略。
    Log4Perl实现了一个用于创建记录器的单例模式,它类似于全局变量。

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

    简明扼要地回答你的问题。 2.)因此,不要将记录器添加到接口中 3.)Log4Perl将根据您的appender配置登录所有级别。通过这种方式,您可以控制您将看到的不可见的内容—正常级别通常是INFO,而特定模块可能正在调试中。在不好的情况下,模式布局将允许您纯粹通过配置将堆栈跟踪添加到日志记录中。