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

+1

디버그에 도움이되는 log4perl 초기화 코드 또는 구성을 게시 할 수 있습니까? Log4perl에서 본 문제는 아닙니다. – justkt

+0

문제를 재현하여 여기에 게시하는 간단한 테스트 케이스를 만듭니다. –

답변

3

log4 * 라이브러리와 비슷한 문제가 있습니다. 이는 내부적으로 둘 다 싱글 톤에 묶여있는 두 가지 로깅 인스턴스화를 사용함을 나타냅니다. 내가 기억 하듯이 두 개의 별도 로깅 문자열을 선택해야합니다.

1
log4perl.oneMessagePerAppender = 1 
관련 문제