Фильтрация сообщений log4j 2.0 для разделения файлов журнала для каждого веб-приложения

Управляющее резюме

Как мне отфильтровать по сервлету, в котором было вызвано сообщение журнала? (в настоящее время используется версия 2.0 beta8)

Зачем мне это делать ...

У меня есть несколько существующих веб-приложений. Они были написаны, чтобы полагаться на проприетарную систему регистрации. Я повторно реализовал ключевой класс из проприетарной системы с нуля и добавил его как класс проприетарной системы как jar и log4j 2.0 как jar в tomcat, тем самым используя порядок загрузки загрузки классов в tomcat, чтобы перенаправить проприетарную систему в log4j . Это успешно, и моя конфигурация log4j теперь контролирует все (Ура!).

Но ... (Всегда есть «Но»!)

Я был очень доволен, пока не обнаружил, что все 4 приложения, развернутые в одном контейнере, не координируют свои записи в один файл журнала в единственной конфигурации, которую я поместил в conf / log4j2.xml (и указал, передав -Dlog4j.configurationFile=/mnt/kui/tomcat/conf/log4j2.xml в командная строка). Я обнаружил несколько сообщений журнала с гораздо более ранними отметками времени (часами ранее) в середине файла журнала. Журналы, выходящие из строя (и, возможно, перезаписанные строки журнала?), конечно, нежелательны.

На самом деле я все равно не хочу, чтобы все они были в одном файле, и я бы предпочел бы журнал для каждого приложения, управляемый одним файлом конфигурации. Сначала я думал, что этого будет легко достичь, поскольку log4j автоматически устанавливает LoggingContext с именем веб-приложения.

Однако я не могу найти реализацию фильтра, которая позволила бы мне фильтровать по LoggingContext. Я понимаю, что с точки зрения каждого приложения существует только один контекст ведения журнала (я думаю), но та же конфигурация файл читается 4 приложениями, поэтому с точки зрения конфигурации LoggingContext не уникален.

Я ищу способ направить каждое приложение в его собственный файл, не имея файла конфигурации для каждого приложения, или необходимости добавлять классы во все приложения или редактировать военные файлы (включая web.xml). Я ооочень ... близок, но это не работает.

Чтобы усложнить ситуацию, мы написали файл jar, который используется всеми четырьмя приложениями, которые также используют это ведение журнала, и одно приложение преобразовано для использования log4j непосредственно в своих классах (но оно по-прежнему использует проприетарные классы, которые ссылаются на собственный класс ведения журнала, который Заменил).

Я уже видел http://logging.apache.org/log4j/2.x/manual/logsep.html, и мой случай кажется наиболее близким к «Общим веб-приложениям и контейнерам служб REST», но этот случай не очень хорошо освещен на этой странице.


person Gus    schedule 30.08.2013    source источник


Ответы (1)


Вы можете посмотреть RoutingAppender, который можно использовать для разделения файлов журналов на основе данных в вашем ThreadContextMap. Вы можете использовать имя веб-приложения в качестве уникального ключа.

Что касается журналов сбоя, в старых бета-версиях была проблема с FastFileAppender. Если добавление было ложным, старый файл не был усечен, но новые события журнала начнут перезаписывать старый файл с самого начала. (Так, например, после вашего последнего события журнала вы увидите вчерашние события журнала). Какую версию ты используешь?

person Remko Popma    schedule 01.09.2013
comment
Используя 2.0beta8, извините, что должен был это сказать. - person Gus; 02.09.2013
comment
Гас, взгляни на issues.apache.org/jira/browse/LOG4J2-326 В частности, пример конфигурации Ральфа может быть полезен для понимания того, как использовать RoutingAppender. Что касается журналов сбоев, можете ли вы создать для этого новый тикет JIRA, который включает вашу конфигурацию и описание проблемы? Спасибо! - person Remko Popma; 03.09.2013
comment
Не уверен, что смогу отправить вам отчет об ошибке. Некоторое время назад я удалил эту конфигурацию (и журналы). Если увижу снова, попробую написать за вас баг. - person Gus; 03.09.2013