使用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中格式化行,以便调试元数据(直到实际日志消息的所有内容)在末尾用空格/制表符填充,并使实际消息从同一列文本开始?
我有这个子来初始化我的记录器:
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?
log4perl在配置文件中有一个阈值选项,用于记录所有级别或更高级别的调用.有没有选项设置它只记录一种类型的呼叫?我只想记录级别"INFO"的调用.
谢谢.
我正在使用Log4perl作为程序包的一部分来捕获特定DBI连接正在执行的操作.我目前的计划是为每个连接创建一个新的记录器对象Log::Log4perl->get_logger($mysql_connect_id),这应该允许各种连接写入不同的文件或相同的文件,而不会相互搞砸.
我担心的是当连接断开并且不再需要记录器时会发生什么.如果Log4perl只是无限期地保留这些记录器,那听起来像是内存泄漏的秘诀.
在我确定它不再有用之后,摆脱记录器的最佳方法是什么?或者,相反,这甚至是一个问题 - Log4perl是否有某种内置的处理机制,已经防止了这种泄漏?
DESTROY看似有希望的方法.但是,它没有记录,并且引发了一堆"在字符串eq中使用未初始化的值"警告,这让我很谨慎; 感觉就像一个黑客.(但如果这是最佳/唯一的方法,我想问题是"如何关闭来自特定包裹的特定警告?") 我想为我的 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 上的错误记录到日志文件中。
我试图设置两个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) 我正在阅读Log4perl,并希望尝试将其用于在Linux机器上运行的Perl脚本的简单日志管理.我也读过newsyslog,logrotate但是想尽可能使用Log4perl.
我正在尝试配置/etc/log4perl.conf文件,以便它:
widget记录器(INFO级别)/opt/myapp/logs/myapp-<datetime>.log,其中<datetime>是日期/时间格式化的字符串2012-12-20myapp-<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每天旋转一次,删除旧文件,并创建一个具有正确时间戳的新文件?提前致谢.
我在我的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 MyLogger在eval语句中添加代码失败,则出现以下错误,并且不会调用后处理.
[错误] 2015/04/27 22:19:07 Carp.pm:166> mkdir/random:在./test.pl第11行被拒绝.
修复此问题的一个选项是添加本地sigdie句柄(如注释代码所示).
但是,我的记录器模块被许多脚本使用.
有没有办法修改我的Logger模块,以便在从eval块内部调用时它会抑制ERROR消息?
我们使用Log :: Log4perl记录当前日期,如下所示:
log4perl.appender.perllog.layout.ConversionPattern=%d{yyyyMMdd.hhmmss:}-%P-%H-%p{2}-%m
Run Code Online (Sandbox Code Playgroud)
有没有办法记录时区?
假设我有一个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记录器.
我怎样才能做到这一点?