Управляющее резюме
Как мне отфильтровать по сервлету, в котором было вызвано сообщение журнала? (в настоящее время используется версия 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», но этот случай не очень хорошо освещен на этой странице.