标签: log4perl

如何将Logl警告捕获到Log4perl日志中?

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: …

perl log4perl

13
推荐指数
2
解决办法
3322
查看次数

如何旋转和压缩Log4perl日志文件?

据我所知,CP4中的Log4Perl或其任何相关模块都不支持日志文件的旋转和压缩.

旋转可以通过使用:

  1. 登录:: Log4perl :: Appender的::文件
  2. Log :: Dispatch :: FileRotate.

但这两个模块都不支持旋转压缩.(Log :: Dispatch :: FileRotate在它的待办事项列表中有它,但它目前没有实现).

可以使用Linux中的标准Logrotate工具,使用Log :: Log4perl :: Appender :: File的recreate_check_interval或recreate_check_signal来完成此操作.

从最初的测试中,它看起来像使用日志轮播与delaycompress选项就可以了-即使在高负荷的机器上,因为一旦文件被移动,log4perl将继续记录到同一个文件句柄,直到该信号毫无遗漏.

但是,如果未使用delaycompress,并且压缩日志文件与通过Perl程序捕获信号之间存在(甚至稍有延迟),则某些日志记录数据可能会丢失.

你怎么看?还有其他我们没有想到的选择吗?

perl rotation log4perl

10
推荐指数
2
解决办法
4220
查看次数

使用Log :: Log4perl创建自记录模块

有没有办法使用Log :: Log4perl创建一个智能自我记录模块,即使没有调用脚本没有初始化Log4perl,它也会将其操作记录到文件中?据我从文档中可以看出,使用Log4perl的唯一方法是从配置中运行脚本初始化它,然后实现Log4perl调用的模块根据调用者的Log4perl配置自行记录.

相反,我希望模块为Log4perl提供默认的初始化配置.这将为模块的类别提供默认文件追加器.然后,我可以通过在调用者中使用不同的配置启动Log4perl来覆盖此行为,如果需要,所有内容都可以正常工作.

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

perl logging log4perl

8
推荐指数
1
解决办法
1757
查看次数

Log4perl:如何在运行时动态加载appender?

我想让模块在运行时管理他们的日志记录,但没有任何东西都指向单个整体配置文件.当处理在不同权限下运行的进程时,我真的不想处理每个需要能够访问系统上每个日志的进程,只需要写入它们的子集.

但是,我没有在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变量吗?

perl logging log4perl

8
推荐指数
2
解决办法
2654
查看次数

可以动态更改Perl的Log :: Log4perl的日志级别而无需更新配置吗?

我有一个在mod_perl下运行的Mason模板,它使用的是Log :: Log4perl.

我想更改特定appender的日志级别,但更改配置太尴尬了,因为它必须通过我们的部署过程才能上线.

有没有办法在Apache启动后在运行时更改appender的日志级别,而不更改配置文件,然后让更改影响任何新的Apache线程?

apache perl logging mod-perl log4perl

8
推荐指数
1
解决办法
1883
查看次数

如何判断Log4perl在运行期间是否发出了任何警告?

我一直在许多脚本中广泛使用Log4perl.我想扩充这些脚本以设置错误代码(如果已记录任何消息WARNERROR消息).基于现有文档,我找不到任何明显的方法来做到这一点.

我想避免对现有脚本进行暴力重写,以便对每条WARNERROR日志消息进行检查; 如果可能的话,我更喜欢在脚本退出之前处理它,就像这个伪代码一样:

if $log->has_warnings_or_errors then
  exit 1
else
  exit 0
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来调用Log4Perl来确定当前的记录器是否存在某些级别的消息?

perl log4perl

6
推荐指数
1
解决办法
247
查看次数

如何安装和使用log4perl

我是新手,log4p并希望使用相同的方法登录我的代码.我收到的错误如下:

无法在@INC中找到Log/Log4perl.pm

我理解的是因为缺少了库.现在,我在哪里以及如何在UNIX环境中安装此库?

我试过安装:

yum install perl-Log-Log4perl-1.30-1.el6.noarch.rpm
Run Code Online (Sandbox Code Playgroud)

这也失败了.我不是在正确的轨道上吗?有人可以给我一个快速启动链接,也告诉如何安装此包,从哪里?

perl log4perl

6
推荐指数
1
解决办法
2万
查看次数

如何禁用特定类的 Log4perl 输出?

我想在项目中使用 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 的调试消息仍然打印到终端。这是为什么?我在这里做错了什么?

perl logging log4perl

5
推荐指数
1
解决办法
847
查看次数

如何在运行时更改log4perl appender的过滤器?

我一直试图弄清楚我是否可以在运行时更改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)

我想将此过滤器更改MyBoolean0SCREENto 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 log4perl

5
推荐指数
1
解决办法
325
查看次数

如何在Log4perl中登录两个不同的文件?

我有一个Perl脚本,可以生成两个不同的数据流。

我需要将它们记录到两个单独的日志文件中。

我知道有两种方法会导致生成不同的日志文件,但在我的情况下似乎都没有帮助:

  1. 使用类别(Perl模块名称)。

    就我而言,这两个流都是在同一代码中产生的(“ main”程序包,但这是无关紧要的,重要的是,字面上我彼此相邻的代码行分别记录到了两个不能分割成不同Perl的位置模块)。

  2. 使用不同的日志级别。

    但是,两者都应以相同的优先级进行记录(例如,两者都记录info()调用并error()视情况而定),因此我不能使用FAQ配方将WARN / ERROR记录到不同的文件中

perl log4perl

5
推荐指数
1
解决办法
601
查看次数

标签 统计

log4perl ×10

perl ×10

logging ×4

apache ×1

mod-perl ×1

rotation ×1