Внешняя конфигурация Log4J2 в приложении Java EE - PullRequest
0 голосов
/ 14 июля 2020

Я работаю над проектом Java EE, файлы конфигурации которого были в папке resources. Веб-проект собирается в военный файл с помощью Maven и развертывается в Tomcat.

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

На всякий случай Вам интересно, как это было на производстве до того, как я отредактировал код, вот оно:

// x stands for `application.conf` or  `en.properties` depending on where in the code the file is being 
getClass().getClassLoader().getResourceAsStream(x)

Я переместил каждый файл из resources в /CATALINA_BASE/conf/myProject, и я читаю по этим путям в код. (мне это не кажется хорошей практикой)

А вот моя версия:

// x stands for `application.conf` or  `en.properties` depending on where in the code the file is being read
new File(System.getProperty("catalina.base") + "/conf/myProject/x")

Очевидно, это отлично работает, но в проекте также есть файл log4j2.properties, который был автоматически читать из пути к классам раньше, и поскольку я вынес конфигурацию извне, я не могу ее прочитать.

Я пробовал устанавливать параметр внутри web.xml, как показано ниже (не уверен, что это правильно to do)

<web-app>
...
    <context-param>
<!--        also tried with log4jConfigLocation-->
        <param-name>log4Configuration</param-name>
        <param-value>file:${catalina.base}/conf/myProject/log42.properties</param-value>
    </context-param>
...
</web-app>

Вывод ошибки при запуске приложения:

ERROR StatusLogger Файл конфигурации log4j2 не найден. Использование конфигурации по умолчанию: запись в консоль только ошибок. Задайте для системного свойства 'org. apache .logging.log4j.simplelog.StatusLogger.level' значение TRACE, чтобы отобразить ведение журнала внутренней инициализации Log4j2.

SLF4J: Не удалось загрузить класс «org. slf4j.impl.StaticLoggerBinder ".

SLF4J: По умолчанию реализация регистратора не работает (NOP)

Любые предложения приветствуются.

ОБНОВЛЕНИЕ: Tomcat, запущенный на сервере, обслуживает несколько других приложений, поэтому установка аргументов виртуальной машины не является вариантом для меня, поскольку другие проекты могут иметь свои конфигурации log4j в своем пути к классам, а аргументы виртуальной машины могут нарушить эти конфигурации.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Вы должны go в Catalina.properties и добавить каталог conf / myProject в путь к классам. Тогда вы можете просто искать файлы в root пути к классам. Вы можете создать конфигурацию ведения журнала для каждого веб-приложения в этом каталоге, изменив свою конфигурацию в web. xml на просто имя файла, то есть log4j2-appname. xml.

Другая альтернатива, которая могла бы работа заключается в том, чтобы изменить URL-адрес вашего файла с file: на file: //.

BTW - у моего работодателя есть приложения, работающие как это - несколько приложений в одном коте. Со временем это вызвало множество проблем, и это действительно плохая идея.

0 голосов
/ 16 июля 2020

Если кто-то столкнется с этой проблемой, я нашел решение.

Покопавшись в исходных файлах org.apache.logging.log4j:log4j-core:2.8.2, я увидел, что класс ConfigurationFactory вызывает PropertiesUtil.getProperties(), в котором есть строка следующим образом:

private static final PropertiesUtil LOG4J_PROPERTIES = new PropertiesUtil("log4j2.component.properties");

Поэтому я создал файл log4j2.component.properties в src/main/resources/, который имеет только одну строку свойств:

log4j.configurationFile=myCustomPath/log4j2.properties

Поскольку мы не можем используйте свойство logging.config для установки пути конфигурации в приложениях Java EE, в отличие от проекта Spring, добавление этого файла c решило мою проблему с экстернализацией конфигурации log4j.

Надеюсь, этот ответ поможет и другим.

...