2011-03-14 129 views
0

我正在研究現有Perl代碼庫中的一項新功能,該功能將允許我們記錄正在發送到數據庫的命令。我將解決方案從Log4perl中解放出來,這使我不必重新創建幾個輪子。Log4perl日誌文件中的雙輸出

不幸的是,我遇到了一個麻煩:每條消息都會被髮送到日誌文件兩次。我希望它停止這樣做。

我的研究(Google)表示,將相同的消息發送到兩個不同的日誌文件是一個常見的問題,但這不是我所看到的。每條消息在單個日誌文件中出現兩次。

有沒有人有任何提示,我應該從哪裏開始尋找方法來糾正這種行爲?


編輯:配置文件看起來是這樣的:

my $log_packages = undef; 

sub _get_logging_modifications { 
    # Hash that is keyed by a package name 
    # and the value is the level at which 
    # to log that package 
    return %{$log_packages} if defined $log_packages; 
    $log_packages = {}; 

    my $log_info = $ENV{PROJECT_LOG_INFO} || ''; 

    for my $log_specification (split(/,/, $log_info)) { 
     # Skip to the next log specification unless we have 
     # a well formed log spec. i.e., Package::Name/LOGLEVEL 
     next unless $log_specification =~ m!([^/]+)/([A-Z]+)!i; 

     my $package = $1; 
     my $log_level = $2; 

     $log_packages->{$package} = $log_level; 
    } 

    return %{$log_packages}; 
} 

BEGIN { 
    my $layout = Log::Log4perl::Layout::PatternLayout->new(
     '[%d] +%X{user_name}+ ||%X{request_uri}||%n ' . 
     '%C:%L - %P - %p - %n ' . 
     '%m%n' 
    ); 

    my $web_data_path = $ENV{PROJECT_DATA_DIR} 
     || File::Temp::tempdir(CLEANUP => 1); 

    my $logfile = "${web_data_path}/app.log"; 
    my $log = Log::Log4perl->get_logger(''); 

    my $app = Log::Log4perl::Appender->new(
     "Log::Dispatch::File", 
     name  => 'APP', 
     filename => $logfile, 
    ); 

    $app->layout($layout); 
    $log->add_appender($app); 
    $log->level($WARN); 

    my %levels = (
     FATAL => $FATAL, 
     ERROR => $ERROR, 
     WARN => $WARN, 
     INFO => $INFO, 
     DEBUG => $DEBUG, 
    ); 

    my %mods = _get_logging_modifications(); 

    for my $cat (keys %mods) { 
     my $level = uc($mods{$cat}); 
     next unless exists($levels{$level}); 
     my $other_log = Log::Log4perl->get_logger($cat); 
     $other_log->level($levels{$level}); 
    } 

    # NEW BLAIRHIPPO CODE STARTS HERE 
    my $dbi_log = Log::Log4perl->get_logger('Project::NewLoggerThing'); 
    my $dbi_layout = Log::Log4perl::Layout::PatternLayout->new('%m%n'); 
    my $dbi_logfile = "/opt/home/blairhippo/test.log"; # FIXME: Make this configurable 
    my $dbi_app = Log::Log4perl::Appender->new(
     "Log::Dispatch::File", 
     name  => 'APP', 
     filename => $dbi_logfile, 
    ); 

    $dbi_app->layout($dbi_layout); 
    $dbi_log->add_appender($dbi_app); 
    $dbi_log->level($DEBUG); # FIXME: Make this configurable 
} 

1; 

我希望這是一個好的漂亮的.conf文件,但我與現有的代碼工作。

+0

你能發佈你的代碼嗎? – CanSpice 2011-03-14 17:24:55

+1

你可以發佈一些log4perl初始化代碼或配置來幫助調試嗎?這不是我用Log4perl看到的問題。 – justkt 2011-03-14 17:24:55

+0

創建一個緊湊的測試用例,重現問題並在此處發佈。 – 2011-03-14 17:24:59

回答

3

我有類似的問題與log4 *庫;這表示使用兩個不同的日誌記錄實例,其中內部都與單例綁定。我記得,你將不得不選擇兩個獨立的日誌字符串。

1
log4perl.oneMessagePerAppender = 1