2011-07-07 60 views
2

在Log4perl的FAQ中,解釋瞭如何編寫配置文件以針對ERROR和INFO使用單獨的文件。如何讓Log4Perl爲每個腳本使用單獨的文件?

這適用於一個腳本,或者如果想將幾個腳本ERROR和INFO混合到 相同的ERROR和INFO日誌。

問題

我非常想每個腳本有它自己的錯誤和INFO文件,而我仍然能夠只使用

$logger->info() 
$logger->error() 

因爲我已log.conf是否正確?

我應該如何在每個腳本中啓動Log4perl?

account.pl

use Log::Log4perl; 
Log::Log4perl::init('log.conf'); 
my $logger = Log::Log4perl->get_logger('????'); 

log.conf

log4perl.logger.account = INFO, AccountErrorLogFile, AccountInfoLogFile, AccountInfoLogFile, SystemErrorLogFile, testScreen 

# Filter to match level ERROR 
log4perl.filter.MatchError = Log::Log4perl::Filter::LevelMatch 
log4perl.filter.MatchError.LevelToMatch = ERROR 
log4perl.filter.MatchError.AcceptOnMatch = true 

# Filter to match level INFO 
log4perl.filter.MatchInfo = Log::Log4perl::Filter::LevelMatch 
log4perl.filter.MatchInfo.LevelToMatch = INFO 
log4perl.filter.MatchInfo.AcceptOnMatch = true 

# Error appender 
log4perl.appender.AccountErrorLogFile       = Log::Log4perl::Appender::File 
log4perl.appender.AccountErrorLogFile.filename     = /logs/error--account-pl.log 
log4perl.appender.AccountErrorLogFile.layout     = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.AccountErrorLogFile.layout.ConversionPattern = %d [%3L] %m%n 
log4perl.appender.AccountErrorLogFile.Filter     = MatchError 

# Info appender 
log4perl.appender.AccountInfoLogFile       = Log::Log4perl::Appender::File 
log4perl.appender.AccountInfoLogFile.filename     = /logs/info--account-pl.log 
log4perl.appender.AccountInfoLogFile.layout     = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.AccountInfoLogFile.layout.ConversionPattern = %d [%3L] %m%n 
log4perl.appender.AccountInfoLogFile.Filter     = MatchInfo 

# Error appender 
log4perl.appender.SystemErrorLogFile       = Log::Log4perl::Appender::File 
log4perl.appender.SystemErrorLogFile.filename     = /logs/error--system-pl.log 
log4perl.appender.SystemErrorLogFile.layout     = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.SystemErrorLogFile.layout.ConversionPattern = %d [%3L] %m%n 
log4perl.appender.SystemErrorLogFile.Filter     = MatchError 

# Info appender 
log4perl.appender.SystemInfoLogFile       = Log::Log4perl::Appender::File 
log4perl.appender.SystemInfoLogFile.filename     = /logs/info--system-pl.log 
log4perl.appender.SystemInfoLogFile.layout     = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.SystemInfoLogFile.layout.ConversionPattern = %d [%3L] %m%n 
log4perl.appender.SystemInfoLogFile.Filter     = MatchInfo 

# Development Appender 
log4perl.appender.testScreen       = Log::Log4perl::Appender::Screen 
log4perl.appender.testScreen.stderr     = 0 
log4perl.appender.testScreen.layout     = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.testScreen.layout.ConversionPattern = %-5p [%3L] %m%n 

回答

6

解決方案:

log.conf

log4perl.logger.account = INFO, AccountErrorLogFile, AccountInfoLogFile, testScreen 
log4perl.logger.system = INFO, SystemErrorLogFile, SystemInfoLogFile, testScreen 

account.pl

Log::Log4perl::init('/var/www/useradmin/cgi-bin/log.conf'); 
my $logger = Log::Log4perl->get_logger('account'); 

system.pl

Log::Log4perl::init('/var/www/useradmin/cgi-bin/log.conf'); 
my $logger = Log::Log4perl->get_logger('system'); 
+1

您可以簡單地使用'$ ARGV'拿到劇本的名字:'(我的劇本$ = $ ARGV)=〜s | \ .pl ||;我的$ logger = Log :: Log4perl-> get_logger($ script);' – Zaid

+0

在Perl中,腳本的名字在$ 0而不是'$ ARGV'中。你也可能需要得到它的基名,'basename($ 0)'。 – slm

相關問題