我通常使用以下樣板文件通過Log::Log4perl登錄腳本。您可以從命令行覆蓋logbase/log配置位置(或者更通常地,在部署時將適當的位置設置爲默認位置),並且在向腳本提供一個或多個-verbose標誌時,覆蓋該日誌記錄並登錄屏幕4個verbose給你屏幕輸出。這使您可以輕鬆地從調試轉換,通過提供標記標誌來獲取每個日誌輸出,將其傳遞到自定義日誌處理程序配置以調試子系統,在生產部署中設置日誌記錄,所有這些都只需最少/無代碼更改。
use Getopt::Long;
use Pod::Usage;
use Log::Log4perl qw/:easy/;
my $opts = { logconf => undef,
logbase => 'corp.team.app.appname'
debug => 0,
};
GetOptions ('logconf|l=s' => \$opts->{logconf},
'logbase=s' => \$opts->{logbase},
'verbose|v+' => \$opts->{debug}, ### debug levels - 0 = off (default), 1 = error, 2 = warn, 3 = info, 4 = debug.
### Ignored if a logconf is provided.
) or pod2usage(0);
### Initialize logging subsystem
init_logger();
### Usage
logger('app_subsystem')->info('some message...');
logger()->debug('debug message...');
### Initialize logging system
sub init_logger {
### If a log configuration is found, and debug was not set, use it
if ( $opts->{logconf}
and -e $opts->{logconf}
and ! $opts->{debug}
) {
Log::Log4perl->init($opts->{logconf});
}
### Otherwise fall through to easy_init a screen logger based on the verboseness level
### Logging off if no config found and no verboseness set
else {
my ($min, $max) = (0, 4);
my %levels;
@levels{$min .. $max} = ($OFF, $ERROR, $WARN, $INFO, $DEBUG);
my $log_level = $opts->{debug};
if ($log_level < $min) {
$log_level = $min;
}
elsif ($log_level > $max) {
$log_level = $max;
}
Log::Log4perl->easy_init($levels{$log_level});
}
}
### Shorthand shim sub to get a logger
### Always returns a Log::Log4perl logger object
sub logger {
my ($category) = @_;
if ($category) {
return Log::Log4perl->get_logger($opts->{logbase} . '.' . $category);
}
return Log::Log4perl->get_logger($opts->{logbase});
}
你也可以考慮使用一個環境變量:'DEBUG = 1 perl perlScript.pl'。然後你可以檢查DEBUG環境變量('$ ENV {DEBUG}')並作出相應的反應。 –
不改變你的代碼,但可能會給你太多的信息:https://metacpan.org/pod/Devel::DumpTrace – toolic