기존의 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 파일 좋겠어요,하지만 기존의 코드로 일하고 있어요.
코드를 게시 할 수 있습니까? – CanSpice
디버그에 도움이되는 log4perl 초기화 코드 또는 구성을 게시 할 수 있습니까? Log4perl에서 본 문제는 아닙니다. – justkt
문제를 재현하여 여기에 게시하는 간단한 테스트 케이스를 만듭니다. –