【发布时间】:2011-01-17 17:18:25
【问题描述】:
我想让模块在运行时管理它们的日志记录,但不要让所有东西都引用一个单一的整体配置文件。当处理在不同权限下运行的进程时,我真的不想处理需要能够访问系统上每个日志的每个进程,而它们只写入其中的一个子集。
但是,我在 Log4perl 手册中没有找到太多关于如何在运行时从配置文件初始化附加附加程序的文档。 http://metacpan.org/pod/Log::Log4perl::Appender 引用了一个 add_appender 方法,但它适用于实例化的 appender 对象而不是 conf 文件。它也没有定义 logger 对象和 logger->appender 关系。
我尝试让每个包都从其自己的 conf 中初始化,但这只会在每次初始化时破坏现有配置。我想做的事情是这样的:
my $foo = Foo->new() ## Checks Log::Log4perl::initialized(), sees that it
## hasn't been initalized yet, inits Log4perl from foo.conf
my $bar = Bar->new() ## Checks Log::Log4perl::initialized(), sees that it
## has been initalized. Adds appenders and loggers defined
## in bar.conf into the initialized configuration
如何解析配置并将其添加到当前配置中?
编辑:使用包变量的问题在于,这只是各种类使用的 Moose 角色,几乎只是 Making self-logging modules with Log::Log4perl 中 Ether 答案的 MooseX::Role::Parameterized 版本。因此,我的记录器正在组合到使用它的库中,并且我没有可以在每次使用它时处理的全局变量。
虽然..
如果我在 MooseX::Role::Parameterized 角色块之外声明一个全局变量,是否每个使用该角色的类都使用相同的 conf 变量?
【问题讨论】:
-
有人吗?我已经浏览了一下 Log4perl 的源代码,但我不能成为第一个想要这样做的人。我正在尝试创建一个 Moose 参数化角色,我可以将其应用于允许我将配置文件传递给角色的类,并且它只是通过初始化 conf 文件或将 conf 文件配置附加到当前初始化的Log4perl。
-
@Oesor:即使在 Moose 角色中声明,包全局仍然是全局的。修改下面的解决方案以使用角色应该很容易(而不是
BUILD机制,您可以使用非常相似的代码使用around BUILDARGS)。 -
@Oesor:根据之前的评论更新了下面的代码。
-
没意识到;认为在角色中使用 PACKAGE 的任何内容都将指代角色组成的包,而不是角色的包。
-
其实——最后一个问题。这显然依赖于 Log4perl 的每次初始化都是通过记录器角色进行的。有什么方法可以检查 Log4perl 初始化的当前源,以便如果我在脚本中使用直接 Log::Log4perl->init('foobar.conf') 对其进行初始化,然后使用使用此记录器角色的库,我可以将库的 init 附加到当前的初始化中吗?