2011-03-14 171 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