Может ли фильтр Log4perl получить доступ к отображенному диагностическому контексту? - PullRequest
0 голосов
/ 04 декабря 2011

Я пишу некоторые сценарии Perl CGI и использую Log4perl для входа в различные файлы. Я подумал, что может быть полезно иметь возможность отслеживать действия конкретного (или различных) пользователей в отдельном файле журнала. Я могу добавить хук в мою подпрограмму для вставки идентификатора пользователя в MDC , но я не знаю ни одного способа доступа к MDC из фильтра . Насколько я знаю, MDC используется только для создания шаблонов.

Это возможно с Log4perl?

В соответствии с предложенным ниже предложением я добавил фильтр в файл конфигурации, но он все еще не работает:

log4perl.appender.User           = Log::Log4perl::Appender::File
log4perl.appender.User.filename  = /data/wwwwii/logs/appUser.log
log4perl.appender.User.syswrite  = 1
log4perl.appender.User.Filter    = User
log4perl.appender.User.layout    = PatternLayout
log4perl.appender.User.layout.ConversionPattern=%p{1} %d{ISO8601}Z [%03r] %15X{remoteAddr}/%05P %M %L  --> %m%n

log4perl.filter.User = sub { Log::Log4perl::MDC->get('userId') == 12; }

Я заполняю идентификатор пользователя, как только выполняю поиск сеанса, но мне никогда не удается создать файл appUser.log. Нет ошибок, которые я вижу.

1 Ответ

2 голосов
/ 04 декабря 2011

Разве вы не можете просто сделать:

my $value   = Log::Log4perl::MDC->get($key);   # for 1 value, or
my $hashref = Log::Log4perl::MDC->get_context; # for the whole context
...