标签: log4perl

如何让log4perl输出更容易阅读?

使用log4perl时,我使用的调试日志布局是:

log4perl.appender.D10.layout=PatternLayout
log4perl.appender.D10.layout.ConversionPattern=%d [pid=%P] %p %F{1} (%L) %M %m%n
log4perl.appender.D10.Filter = DebugAndUp
Run Code Online (Sandbox Code Playgroud)

这会生成非常详细的调试日志,例如:

2008/11/26 11:57:28 [pid=25485] DEBUG SomeModule.pm (331) functions::SomeModule::Test Test XXX was successfull
2008/11/26 11:57:29 [pid=25485] ERROR SomeOtherUnrelatedModule.pm (99999) functions::SomeModule::AnotherTest AnotherTest YYY has faled
Run Code Online (Sandbox Code Playgroud)

这很好用,并提供出色的调试数据.

但是,调试日志的每一行都包含不同的函数名称,pid长度等.这使得每个行的布局都不同,并且使得读取调试日志比需要的更加困难.

是否有一种方法在log4perl中格式化行,以便调试元数据(直到实际日志消息的所有内容)在末尾用空格/制表符填充,并使实际消息从同一列文本开始?

perl logging log4perl

4
推荐指数
2
解决办法
1197
查看次数

如何在Log4perl中抑制输出到stdout和stderr?

我有这个子来初始化我的记录器:

sub initLogfiles{
    Log::Log4perl->easy_init($INFO); # We log all debug, info, warn, error and fatal messages.
        my $userlogappender = Log::Log4perl::Appender->new(
        "Log::Log4perl::Appender::File",
        filename => USERLOGFILE,
        mode     => "append",
        recreate => 1
    );
    my $userloglayout = Log::Log4perl::Layout::PatternLayout->new("%d;%m%n");
    $userlogappender->layout($userloglayout);
    $userlogger->add_appender($userlogappender);
}
Run Code Online (Sandbox Code Playgroud)

我只想在我的日志文件中有loginfo.我如何防止这次登录到stdout?

perl stdout log4perl

4
推荐指数
2
解决办法
1440
查看次数

如何仅记录Log4perl中的INFO级别?

log4perl在配置文件中有一个阈值选项,用于记录所有级别或更高级别的调用.有没有选项设置它只记录一种类型的呼叫?我只想记录级别"INFO"的调用.

谢谢.

perl log4perl

4
推荐指数
1
解决办法
157
查看次数

当我不再需要它时处置Log4perl记录器

我正在使用Log4perl作为程序包的一部分来捕获特定DBI连接正在执行的操作.我目前的计划是为每个连接创建一个新的记录器对象Log::Log4perl->get_logger($mysql_connect_id),这应该允许各种连接写入不同的文件或相同的文件,而不会相互搞砸.

我担心的是当连接断开并且不再需要记录器时会发生什么.如果Log4perl只是无限期地保留这些记录器,那听起来像是内存泄漏的秘诀.

在我确定它不再有用之后,摆脱记录器的最佳方法是什么?或者,相反,这甚至是一个问题 - Log4perl是否有某种内置的处理机制,已经防止了这种泄漏?


编辑: 在一个问题的评论中提到,可能值得一提:Log :: Log4perl :: Logger有一个DESTROY看似有希望的方法.但是,它没有记录,并且引发了一堆"在字符串eq中使用未初始化的值"警告,这让我很谨慎; 感觉就像一个黑客.(但如果这是最佳/唯一的方法,我想问题是"如何关闭来自特定包裹的特定警告?")

perl log4perl

4
推荐指数
1
解决办法
763
查看次数

使用 Log::Log4perl 记录所有意外错误

我想为我的 Perl 脚本生成一个日志。但是当我使用Log::Log4perl时,我如何捕获脚本在任何情况下都会抛出的错误。如何将其记录到日志文件中。目前,我在诸如 ERROR()、DEBUG() 等各种标签中明确写入的内容是唯一被打印到日志文件的标签。

有没有办法使用 Log::Log4perl 来做到这一点。

例如在下面的代码中:

use strict;
use warnings;
use Log::Log4perl qw(:easy);

Log::Log4perl->easy_init( { level   => $DEBUG,
                            file    => ">>test.log" });

my $logger = Log::Log4perl->get_logger();                           

$logger->fatal( "This is", " fatal");
$logger->error( "This is error");
$logger->warn(  "This is warn");
$logger->info(  "This is info");
$logger->debug( "This is debug");
$logger->trace( "This is trace");

my $a = 10;

my $b = $a/0; 
Run Code Online (Sandbox Code Playgroud)

除以零错误不会记录到脚本中。我的原始脚本太复杂,无法检查每个错误,因此还需要将 stderr 上的错误记录到日志文件中。

error-handling perl log4perl

4
推荐指数
1
解决办法
301
查看次数

log4perl如何同时写入STDERR和文件?

我试图设置两个appender,但似乎只写STDERR:

my $header = "######$scriptname $version";
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init($DEBUG);
my $logger = get_logger();
my $layout = Log::Log4perl::Layout::PatternLayout->new(
"%d %p> %F{1}:%L %M - %m%n");
my $appender = Log::Log4perl::Appender->new(
        "Log::Dispatch::File",
        filename=>$scriptname.".log",
        mode => "append"
);
$appender->layout($layout);
my $stderr = Log::Log4perl::Appender::Screen->new(
        stderr =>0,
        );

$stderr->layout($layout);
$logger->info($header);
Run Code Online (Sandbox Code Playgroud)

perl log4perl

3
推荐指数
1
解决办法
2280
查看次数

如何让Log4perl每天轮换我的日志?

我正在阅读Log4perl,并希望尝试将其用于在Linux机器上运行的Perl脚本的简单日志管理.我也读过newsyslog,logrotate但是想尽可能使用Log4perl.

我正在尝试配置/etc/log4perl.conf文件,以便它:

  • 定义将所有输出写入的widget记录器(INFO级别)/opt/myapp/logs/myapp-<datetime>.log,其中<datetime>是日期/时间格式化的字符串2012-12-20
  • myapp-<datetime>.log文件需要每天(最好在午夜)旋转,删除旧文件,并创建一个新文件<datetime> + 1.例如,myapp-2012-12-20.log将替换为myapp-2012-12-21.log等.

这是我认为最接近的最佳尝试,但仍缺少一些配置:

#####/etc/log4perl.conf############################################################
log4perl.logger.widget                      = INFO, MyAppLogAppender

log4perl.appender.MyAppLogAppender          = Log::Log4perl::Appender::File
log4perl.appender.MyAppLogAppender.filename = /opt/myapp/logs/myapp-???.log
log4perl.appender.MyAppLogAppender.layout   = Log::Log4perl::Layout::SimpleLayout
###################################################################################
Run Code Online (Sandbox Code Playgroud)

如何配置log4perl.appender.MyAppLogAppender每天旋转一次,删除旧文件,并创建一个具有正确时间戳的新文件?提前致谢.

linux perl logging log4perl

3
推荐指数
1
解决办法
4538
查看次数

Perl sigdie处理程序和eval

我在我的Logger模块中覆盖了我的SIG模具处理程序.

# Catch die messages and log them with logdie
$SIG{__DIE__} = \&logdie;
Run Code Online (Sandbox Code Playgroud)

现在,程序按预期运行,将调用后处理.

use strict;
use warnings;
use File::Path;
# use MyLogger;

my $dir="/random";
eval {
  # local $SIG{__DIE__};
  File::Path::make_path($dir);
};
if($@) {
 warn("Cannot create $dir :$@ \n");
}
print "Post processing \n";
Run Code Online (Sandbox Code Playgroud)

但是,如果我包含我的记录器模块并且use MyLoggereval语句中添加代码失败,则出现以下错误,并且不会调用后处理.

[错误] 2015/04/27 22:19:07 Carp.pm:166> mkdir/random:在./test.pl第11行被拒绝.

修复此问题的一个选项是添加本地sigdie句柄(如注释代码所示).

但是,我的记录器模块被许多脚本使用.

有没有办法修改我的Logger模块,以便在从eval块内部调用时它会抑制ERROR消息?

perl eval log4perl

3
推荐指数
1
解决办法
267
查看次数

如何使用Log :: Log4perl记录时区?

我们使用Log :: Log4perl记录当前日期,如下所示:

log4perl.appender.perllog.layout.ConversionPattern=%d{yyyyMMdd.hhmmss:}-%P-%H-%p{2}-%m
Run Code Online (Sandbox Code Playgroud)

有没有办法记录时区?

perl logging timezone log4perl

3
推荐指数
1
解决办法
173
查看次数

在Perl中读取shell脚本的控制台输出

假设我有一个print_error.sh看起来像这样的shell脚本:

#!/usr/bin/bash

echo "ERROR: Bla bla, yada yada."
exit 1
Run Code Online (Sandbox Code Playgroud)

现在我在Perl脚本中,用这个shell脚本调用

system("print_error.sh")
Run Code Online (Sandbox Code Playgroud)

我现在想要读取控制台输出print_error.sh并将其写入Log4perl记录器.

我怎样才能做到这一点?

unix shell console perl log4perl

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

标签 统计

log4perl ×10

perl ×10

logging ×3

console ×1

error-handling ×1

eval ×1

linux ×1

shell ×1

stdout ×1

timezone ×1

unix ×1