【问题标题】:Double Output in Log4perl Log FileLog4perl 日志文件中的双重输出
【发布时间】:2013-10-17 06:58:18
【问题描述】:

我正在研究现有 Perl 代码库中的一项新功能,该功能允许我们记录发送到数据库的命令。我基于 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 文件,但我正在使用现有代码。

【问题讨论】:

  • 你能发布一些 log4perl 初始化代码或配置来帮助调试吗?这不是我在使用 Log4perl 时看到的问题。
  • 创建一个能重现问题的紧凑测试用例并将其发布在这里。
  • 现有代码的性质使得紧凑的测试用例比我希望的更具挑战性。我会看看我能做些什么,以及发布配置内容的权限。 (不幸的是,它被标记为“专有和机密”。)
  • 您可能会发现将上面的 Log4perl 代码转换为简单的 .conf 文件可以解决问题。如果你想不通,这就是我要做的,因为无论如何都需要这样做。
  • @Ether:同意 .conf 会更可取,但我是该项目的新手,所以就建议对不存在的根深蒂固的位进行更改而言,我非常保守t 实际上打破了。

标签: perl log4perl


【解决方案1】:

Log::Log4perl FAQ 中有一个问题:I keep getting duplicate log messages! What's wrong?

【讨论】:

  • 这引导我找到解决方案,即在 add_appender 调用之前插入$dbi_log->additivity(0);。谢谢!
【解决方案2】:

我在 log4* 库中也遇到过类似的问题;这表明使用了两种不同的日志记录实例,其中两者在内部都与单例相关联。我记得,您必须选择两个单独的日志记录字符串。

【讨论】:

    【解决方案3】:
    log4perl.oneMessagePerAppender = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2019-03-20
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多