2015-10-23 2 views
2

У меня есть регистратор с двумя приложениями (один экран и другой файл). Я хочу иметь приложение Screen с уровнем журнала переменных, который можно изменить, и File appender, который будет регистрировать все независимо от того, что. Так, например, вы можете отключить любой вывод на экране (Screen appender), но получить полный вход на уровень TRACE в вашем файле журнала (File appender). Мне удалось изменить приложение Screen appender, но я не могу установить File appender для того же регистратора на уровень TRACE. Я пробовал использовать разные настройки порога, но без успеха.Как установить два приложения с разными уровнями журнала в Log :: Log4perl?

# Define a category logger 
my $log = Log::Log4perl->get_logger("main"); 

# Define a layout 
my $layout = Log::Log4perl::Layout::PatternLayout->new("[%d{yyyy/MM/dd HH:mm:ss,SSS}]%m%n"); 

# Define a file appender 
my $file_appender = Log::Log4perl::Appender->new(
        "Log::Log4perl::Appender::File", 
        name  => "Logfile", 
        filename => "$logfile", 
        autoflush => 1, 
        umask => 022, 
        header_text => "INVOCATION:$0 @ARGV", 
        #Threshold => "TRACE", DOES NOT WORK 
       ); 

# Define a stderr appender 
my $stderr_appender = Log::Log4perl::Appender->new(
        "Log::Log4perl::Appender::ScreenColoredLevels", 
        name  => "Screen", 
        stderr => 1, 
       ); 

# Have both appenders use the same layout (could be different) 
$stderr_appender->layout($layout); 
$file_appender->layout($layout); 

#add both appenders to logger 
$log->add_appender($stderr_appender); 
$log->add_appender($file_appender); 

#add a level to logger 
#$log_level coming from command line or configuration 
$log->level($log_level); 

#$file_appender->threshold("TRACE"); THIS DOES NOT WORK 
#Log::Log4perl->appender_thresholds_adjust(-1, ['Logfile']); NOR THIS 

#check your appenders 
#print Dumper(Log::Log4perl->appenders()); 

ответ

2

Из log4perl FAQ:

Я хочу войти ERROR и WARN сообщения в различные файлы! Как я могу это сделать?

Предположим, вы хотели, чтобы каждый оператор регистрации записывался в другой файл на основе приоритета оператора. Предполагается, что сообщения с приоритетом WARN должны перейти в /tmp/app.warn, события приоритеты, поскольку ERROR должна закончиться в /tmp/app.error.

Теперь, если вы определяете два appenders AppWarn и AppError и назначаете их как корневому журналу, сообщения, всплывающие из любых журналов ниже, будут регистрироваться обоими пристрастиями из-за функции распространения сообщений Log4perl. Если вы ограничите свое воздействие с помощью механизма порога appender и установите порог AppWarn для WARN и AppError в ERROR, вы все равно получите сообщения ERROR в AppWarn, потому что параметр WARN от AppWarn просто отфильтрует сообщения с более низким приоритетом, чем WARN - ERROR выше и будет разрешено пройти.

Для этого необходим пользовательский фильтр Log4perl, доступный с Log :: Log4perl 0.30.

В обоих приложениях необходимо убедиться, что приоритет встречных сообщений точно соответствует приоритету, на который должен регистрироваться appender. Для выполнения этой задачи, давайте определим два пользовательских фильтров, MatchError и MatchWarn, которые, при подключении к их appenders ограничат сообщения, передаваемые на них тем, соответствие данного приоритета:

log4perl.logger = WARN, AppWarn, AppError 
     # Filter to match level ERROR 
    log4perl.filter.MatchError = Log::Log4perl::Filter::LevelMatch 
    log4perl.filter.MatchError.LevelToMatch = ERROR 
    log4perl.filter.MatchError.AcceptOnMatch = true 
     # Filter to match level WARN 
    log4perl.filter.MatchWarn = Log::Log4perl::Filter::LevelMatch 
    log4perl.filter.MatchWarn.LevelToMatch = WARN 
    log4perl.filter.MatchWarn.AcceptOnMatch = true 
     # Error appender 
    log4perl.appender.AppError = Log::Log4perl::Appender::File 
    log4perl.appender.AppError.filename = /tmp/app.err 
    log4perl.appender.AppError.layout = SimpleLayout 
    log4perl.appender.AppError.Filter = MatchError 
     # Warning appender 
    log4perl.appender.AppWarn = Log::Log4perl::Appender::File 
    log4perl.appender.AppWarn.filename = /tmp/app.warn 
    log4perl.appender.AppWarn.layout = SimpleLayout 
    log4perl.appender.AppWarn.Filter = MatchWarn 

В appenders Определенные выше AppWarn и AppError регистрируются в /tmp/app.warn и /tmp/app.err соответственно и имеют специальные фильтры MatchWarn и MatchError. Эта настройка будет направлять все сообщения WARN, выпущенные в любом месте системы, в /tmp/app.warn (и сообщения ERROR на /tmp/app.error) - без каких-либо совпадений.

Также посмотрите на документы CPAN для log4perl и его подкомитетов модулей:

http://search.cpan.org/~mschilli/Log-Log4perl-1.46/lib/Log/Log4perl/Filter.pm

+0

Я изменил свой пример, чтобы работать с моим USECASE, например, мне нужно LevelRange вместо LevelMatch и корневой регистратор должен быть установленным на уровне TRACE. log4perl.category.main = TRACE, Logfile, экран # Фильтр диапазон от следовых до log4perl.filter.MatchTraceUp = Вход :: Log4perl :: Filter :: LevelRange log4perl.filter.MatchTraceUp.LevelMin = TRACE log4perl .filter.MatchTraceUp.LevelMax = FATAL log4perl.filter.MatchTraceUp.AcceptOnMatch = true – mocnii

 Смежные вопросы

  • Нет связанных вопросов^_^