使用 Log::Log4perl 制作自记录模块

2023-11-24

有没有办法使用日志::Log4perl制作一个智能自记录模块,即使在没有调用脚本且未初始化 Log4perl 的情况下,也可以将其操作记录到文件中?据我从文档中可以看出,使用 Log4perl 的唯一方法是在运行脚本中从配置初始化它,然后实现 Log4perl 调用的模块根据调用者的 Log4perl 配置记录自己。

相反,我希望模块为 Log4perl 提供默认的初始化配置。这将为模块的类别提供默认的文件附加器。然后,如果需要,我可以通过使用不同的配置在调用者中初始化 Log4perl 来覆盖此行为,并且一切都会正常工作。

这种防御性日志记录行为是否可能,或者我是否需要在每个调用我想要记录的模块的 .pl 脚本中依赖初始化 Log4perl?


我在自定义日志角色中执行此操作Moose(删除无关的复杂代码):

package MyApp::Role::Log;

use Moose::Role;
use Log::Log4perl;

my @methods = qw(
    log trace debug info warn error fatal
    is_trace is_debug is_info is_warn is_error is_fatal
    logexit logwarn error_warn logdie error_die
    logcarp logcluck logcroak logconfess
);

has _logger => (
    is => 'ro',
    isa => 'Log::Log4perl::Logger',
    lazy_build => 1,
    handles => \@methods,
);

around $_ => sub {
    my $orig = shift;
    my $this = shift;

    # one level for this method itself
    # two levels for Class:;MOP::Method::Wrapped (the "around" wrapper)
    # one level for Moose::Meta::Method::Delegation (the "handles" wrapper)
    local $Log::Log4perl::caller_depth;
    $Log::Log4perl::caller_depth += 4;

    my $return = $this->$orig(@_);

    $Log::Log4perl::caller_depth -= 4;
    return $return;

} foreach @methods;

method _build__logger => sub {
    my $this = shift;

    my $loggerName = ref($this);
    Log::Log4perl->easy_init() if not Log::Log4perl::initialized();
    return Log::Log4perl->get_logger($loggerName)
};

正如你所看到的,日志对象是自初始化的——如果Log::Log4perl->init还没有被调用,那么easy_init叫做。您可以轻松地修改它以允许每个模块自定义其记录器——我使用可选的角色参数来做到这一点,ref($this)作为默认后备。

附言。您可能还想看看MooseX::Log::Log4perl,这是我在使用上面的记录器角色之前开始的地方。有一天,当我有时间时,我会向该 MX 模块提交一些急需的补丁,以合并我添加的一些功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Log::Log4perl 制作自记录模块 的相关文章

随机推荐

  • 如何对 BindingList 进行排序?

    我有数千个 MyClass 对象存储在BindingList
  • 标准差 NumPy 函数的内存消耗

    我目前正在使用 GDAL 的 Python 绑定来处理相当大的栅格数据集 gt 4 GB 由于将它们立即加载到内存中对我来说不是可行的解决方案 因此我将它们读入较小的块并逐段进行计算 为了避免为每个块读取进行新的分配 我正在使用buf ob
  • 如何在iOS应用程序项目中正确嵌入第3方.dylib文件以供App Store发布?

    我正在使用支持 H264 的 PJSIP 库构建一个 iOS 应用程序 构建 H264 时 我得到 1 个 a 文件和 2 个 dylib 文件 我尝试通过添加为 嵌入式库 以及创建一个单独的框架然后将其添加到 嵌入式库 来在我的项目中使用
  • 使用非连续行号的数据子集

    我有一个 30 行 100 列 X 的数据框 我想创建一个新的数据框 Y 其中包含较大数据框中的特定行 例如 我希望数据框 Y 包含第 1 行到第 5 行 第 10 行到第 14 行以及第 20 行 我知道我可以使用代码 Y lt X 1
  • 使用 g++ 的符号可见性

    我在 Linux Mac 下编译了一个隐藏了符号的 C 库 我用过 attribute visibility hidden 对于我所有的课程并使用选项进行编译 c O2 fPIC MMD MP MF Mac下 使用Mac 依赖项 工作完成得
  • 检测已安装的 Excel 版本(和 Service Pack)

    我需要能够从我正在开发的一些 NET 代码中检测我的计算机中安装的 Excel 版本 我目前正在使用应用程序版本为此 但它没有给我有关服务包的信息 我宁愿避免这样的事情 http www mvps org access api api006
  • 添加代码块而不执行它

    In knitr 是否有任何选项允许插入代码而不执行 我只希望代码以与其他代码相同的样式出现在文档中knitr代码块 我对 Rnw 文档中的 LaTeX 选项特别感兴趣 就像 Ramnath 评论的那样 这可以通过使用来实现eval FAL
  • Facebook 的 5000 个帖子 API 限制

    我对 Facebook 限制 API 调用的方式有疑问 到本文底部 http developers facebook com blog post 478 脸书 说 除了上面列出的每个表和连接的文档中提到的限制之外 了解我们在运行可见性检查之
  • 从 WCF 中分块获取大 List

    我正在尝试从 WCF 服务获取实体列表 我遇到的问题是网络上存在一些严重的延迟 因此数据需要相当长的时间才能到达我的客户端 我的想法是找到一种方法来获取前 1000 个 然后将它们推送到 UI 同时等待下一个到达 我想这就像分页 但我只想对
  • 为什么内部类可以有静态final成员但不能有静态方法?

    为什么我们可以在非静态内部类中拥有静态最终成员但不能拥有静态方法 我们可以在外部类之外访问内部类的 static Final 成员变量而不实例化内部类吗 您可以在 a 中使用静态方法static 内 类 public class Outer
  • 什么是规范 URL 以及它们如何影响您的 SEO?

    我听人们提到过 Canonical URL 标签 但我不知道它的含义或目的是什么 它是什么以及它如何影响 SEO 当您拥有指向相同内容但没有实际重定向的不同 URL 时 可以使用规范 URL 假设您的域名是example com www e
  • 在 ASP.NET Core 中使用实体框架 6

    假设我有 适用于 NET Core 框架的 ASP NET Core 独立 Web API 项目 具有完整 NET 框架的 EF6 数据模型的类库 ASP NET Core项目引用类库 这里提出的架构 https learn microso
  • django dev 服务器,向静态文件添加标头

    使用 django 开发服务器 1 7 4 我想向它提供的所有静态文件添加一些标头 看起来我可以将自定义视图传递给django conf urls static static 像这样 if settings DEBUG from djang
  • 为什么Javascript中.length后面没有()?

    我是一名业余程序员 我研究过多种语言 几乎总是发现 长度 是一种方法 函数 据我所知 我已经接受过培训 任何方法调用都必须在后面加上括号 即使没有参数也是如此 在 Javascript 中并非如此 为什么 C length 或 length
  • 为什么java中不能在一个文件中定义两个公共类? [复制]

    这个问题在这里已经有答案了 为什么B类不能公开 如何在其他班级中使用班级 是不是在 Cons 里面定义比较好 public class B why not class B int x B int n x n System out print
  • 使用python通过FTP下载大文件

    我尝试每天从我的服务器下载备份文件到本地存储服务器 但我遇到了一些问题 我写了这段代码 删除了无用的部分 如电子邮件功能 import os from time import strftime from ftplib import FTP
  • 有效的算法以频率随机选择项目

    给定一个数组n词频对 w0 f0 w1 f1 wn 1 fn 1 where wi is a word fi is an integer frequencey and the sum of the frequencies fi m I wa
  • 解决错误:无法在 Android Studio 中访问 Publisher?

    我在编译代码时收到此错误 任何人都可以帮助我如何解决此错误或可能导致此错误的原因是什么 Edit1 项目的Gradle文件 上面的问题还附带了错误日志 请检查一下 import com google gms googleservices G
  • 收到异常“枚举时集合发生了变异”

    当我使用此代码时 我收到 Collection was mutated while being enumerated 异常 任何人都可以建议我如何摆脱这种情况 PaymentTerms currentElement for currentE
  • 使用 Log::Log4perl 制作自记录模块

    有没有办法使用日志 Log4perl制作一个智能自记录模块 即使在没有调用脚本且未初始化 Log4perl 的情况下 也可以将其操作记录到文件中 据我从文档中可以看出 使用 Log4perl 的唯一方法是在运行脚本中从配置初始化它 然后实现