Log4perl是一个很棒的日志工具.
该警告编译也是一个必不可少的工具.
但是,当Perl脚本作为守护程序运行时,Perl警告会打印到STDERR中,没有人可以看到它们,而不会打印到相关程序的Log4perl日志文件中.
有没有办法将Perl警告捕获到Log4perl日志中?
例如,此代码将很好地记录到日志文件中,但是如果它作为守护程序运行,则Perl警告将不会包含在日志中:
#!/usr/bin/env perl
use strict;
use warnings;
use Log::Log4perl qw(get_logger);
# Define configuration
my $conf = q(
log4perl.logger = DEBUG, FileApp
log4perl.appender.FileApp = Log::Log4perl::Appender::File
log4perl.appender.FileApp.filename = test.log
log4perl.appender.FileApp.layout = PatternLayout
);
# Initialize logging behaviour
Log::Log4perl->init( \$conf );
# Obtain a logger instance
my $logger = get_logger("Foo::Bar");
$logger->error("Oh my, an error!");
$SIG{__WARN__} = sub {
#local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
$logger->warn("WARN @_");
};
my $foo = 100;
my $foo = 44;
Run Code Online (Sandbox Code Playgroud)
这仍然打印到STDERR: …
据我所知,CP4中的Log4Perl或其任何相关模块都不支持日志文件的旋转和压缩.
旋转可以通过使用:
但这两个模块都不支持旋转和压缩.(Log :: Dispatch :: FileRotate在它的待办事项列表中有它,但它目前没有实现).
可以使用Linux中的标准Logrotate工具,使用Log :: Log4perl :: Appender :: File的recreate_check_interval或recreate_check_signal来完成此操作.
从最初的测试中,它看起来像使用日志轮播与delaycompress选项就可以了-即使在高负荷的机器上,因为一旦文件被移动,log4perl将继续记录到同一个文件句柄,直到该信号毫无遗漏.
但是,如果未使用delaycompress,并且压缩日志文件与通过Perl程序捕获信号之间存在(甚至稍有延迟),则某些日志记录数据可能会丢失.
你怎么看?还有其他我们没有想到的选择吗?
有没有办法使用Log :: Log4perl创建一个智能自我记录模块,即使没有调用脚本没有初始化Log4perl,它也会将其操作记录到文件中?据我从文档中可以看出,使用Log4perl的唯一方法是从配置中运行脚本初始化它,然后实现Log4perl调用的模块根据调用者的Log4perl配置自行记录.
相反,我希望模块为Log4perl提供默认的初始化配置.这将为模块的类别提供默认文件追加器.然后,我可以通过在调用者中使用不同的配置启动Log4perl来覆盖此行为,如果需要,所有内容都可以正常工作.
这种防御性日志记录行为是否可行,或者我是否需要依赖于在调用我想要记录的模块的每个.pl脚本中启动Log4perl?
我想让模块在运行时管理他们的日志记录,但没有任何东西都指向单个整体配置文件.当处理在不同权限下运行的进程时,我真的不想处理每个需要能够访问系统上每个日志的进程,只需要写入它们的子集.
但是,我没有在Log4perl手册中找到有关如何在运行时从配置文件初始化其他appender的文档.http://metacpan.org/pod/Log::Log4perl::Appender引用了一个add_appender方法,但它适用于实例化的appender对象而不是conf文件.它也没有定义记录器对象和logger-> appender关系.
我尝试从每个软件包初始化每个软件包,但这只是在每次初始化时都会破坏现有的配置.我想做的是:
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
Run Code Online (Sandbox Code Playgroud)
如何解析并将配置添加到当前配置中?
编辑:使用包变量的Probalem是,这只是各种类所使用的Moose角色,几乎只是MooseX :: Role ::参数化版本的Ether在使用Log :: Log4perl制作自我记录模块时的答案.因此,我的记录器正在编写到使用它的库中,并且我没有可以在每次使用它时使用的全局变量.
虽然..
如果我在MooseX :: Role :: Parameterized角色块之外声明一个全局变量,那么每个使用该角色的类都会使用相同的conf变量吗?
我有一个在mod_perl下运行的Mason模板,它使用的是Log :: Log4perl.
我想更改特定appender的日志级别,但更改配置太尴尬了,因为它必须通过我们的部署过程才能上线.
有没有办法在Apache启动后在运行时更改appender的日志级别,而不更改配置文件,然后让更改影响任何新的Apache线程?
我一直在许多脚本中广泛使用Log4perl.我想扩充这些脚本以设置错误代码(如果已记录任何消息WARN
或ERROR
消息).基于现有文档,我找不到任何明显的方法来做到这一点.
我想避免对现有脚本进行暴力重写,以便对每条WARN
或ERROR
日志消息进行检查; 如果可能的话,我更喜欢在脚本退出之前处理它,就像这个伪代码一样:
if $log->has_warnings_or_errors then
exit 1
else
exit 0
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来调用Log4Perl来确定当前的记录器是否存在某些级别的消息?
我是新手,log4p
并希望使用相同的方法登录我的代码.我收到的错误如下:
无法在@INC中找到Log/Log4perl.pm
我理解的是因为缺少了库.现在,我在哪里以及如何在UNIX环境中安装此库?
我试过安装:
yum install perl-Log-Log4perl-1.30-1.el6.noarch.rpm
Run Code Online (Sandbox Code Playgroud)
这也失败了.我不是在正确的轨道上吗?有人可以给我一个快速启动链接,也告诉如何安装此包,从哪里?
我想在项目中使用 Log4perl,但对某个类(在本例中为 Net::Amazon)禁用它。我以为这会很容易,但不知何故我失败了。
我尝试使用
use Log::Log4perl (:easy_init);
use Net::Amazon;
my $amz = Net::Amazon->new( ... );
my $log = Log::Log4perl->easy_init($DEBUG);
$log = $log->get_logger("Net::Amazon");
$log->level($OFF);
$log = $log->get_logger(__PACKAGE__);
$log->info("Hello World.");
Run Code Online (Sandbox Code Playgroud)
不幸的是,Net::Amazon 的调试消息仍然打印到终端。这是为什么?我在这里做错了什么?
我一直试图弄清楚我是否可以在运行时更改appender的过滤器,我已经通过配置文件定义了.
log4perl.filter.M1 = Log::Log4perl::Filter::LevelMatch
log4perl.filter.M2 = Log::Log4perl::Filter::LevelMatch
log4perl.filter.M1.LevelToMatch = INFO
log4perl.filter.M1.AcceptOnMatch = true
log4perl.filter.M2.LevelToMatch = WARN
log4perl.filter.M2.AcceptOnMatch = true
log4perl.filter.MyBoolean0 = Log::Log4perl::Filter::Boolean
log4perl.filter.MyBoolean0.logic = M1
log4perl.filter.MyBoolean1 = Log::Log4perl::Filter::Boolean
log4perl.filter.MyBoolean1.logic = M1 || M2
log4perl.appender.SCREEN.Filter = MyBoolean0
Run Code Online (Sandbox Code Playgroud)
我想将此过滤器更改MyBoolean0
为SCREEN
to MyBoolean1
,但是在我的程序开始运行后执行此操作.
使用Data :: Dumper 查询APPENDER_BY_NAME
哈希SCREEN
显示以下内容:
$VAR1 = bless( {
'appender' => bless( {
'Filter' => 'MyBoolean0',
'color' => {
...
...
'filter' => bless( {·
'params' => {·
'M3' => bless( {·
'LevelToMatch' => …
Run Code Online (Sandbox Code Playgroud) 我有一个Perl脚本,可以生成两个不同的数据流。
我需要将它们记录到两个单独的日志文件中。
我知道有两种方法会导致生成不同的日志文件,但在我的情况下似乎都没有帮助:
使用类别(Perl模块名称)。
就我而言,这两个流都是在同一代码中产生的(“ main”程序包,但这是无关紧要的,重要的是,字面上我彼此相邻的代码行分别记录到了两个不能分割成不同Perl的位置模块)。
使用不同的日志级别。
但是,两者都应以相同的优先级进行记录(例如,两者都记录info()
调用并error()
视情况而定),因此我不能使用FAQ配方将WARN / ERROR记录到不同的文件中。