#java #openshift #log4j2 #java.util.logging #open-liberty
#java #openshift #log4j2 #java.util.logging #открыть-свобода
Вопрос:
Попытка развернуть приложение liberty в OCP и объединить ведение журнала liberty с ведением журнала приложения для примера: https://openliberty.io/blog/2020/05/19/log4j-openshift-container-platform.html
Наше приложение использует LOG4J2 для настройки и запуска ведения журнала. Это сработало sofar со следующими зависимостями.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
и используйте следующую строку кода, чтобы сообщить приложению, где log4J2.xml файл находится
Configurator.initialize(null, log4jConfigUrlFile);
наше ведение журнала закончилось в файлах журнала, и все было в порядке. Однако теперь нам нужен какой-то способ использовать Log4J2 для настройки наших регистраторов, но само ведение журнала должно заканчиваться в июле, чтобы его можно было использовать OCP и их стеком EFK.
Я пытался использовать следующие зависимости.
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
Проблем с компиляцией нет, программа запускается, и я вижу, что в консоли отображается запись в журнал. Однако, когда я пытаюсь настроить наш log4j2.xml (который находится на пути к классу) и, например, не хотят видеть информационные сообщения, которые они все еще появляются. кажется, он не загружен или не используется. Еще одна вещь, которую я замечаю, это то, что LoggingFactory — это тот, который находится в slf4j-jdk14, возможно, это проблема. Мы также больше не можем использовать конфигуратор, поскольку он является частью log4j-core, и у вас не может быть двух реализаций (log4j-to-slf4j) на одном пути к классу.
Я также попытался установить свойство расположения файла журнала
-Dlog4j.configurationFile=./resources/log4j/log4j2.xml
Я попробовал это с несколькими перестановками структуры каталогов, чтобы быть уверенным, и не работает. Также попробовал следующее.
-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE
Просто чтобы получить еще несколько отладочных результатов, но даже это не сработало. Есть ли что-нибудь еще, что я могу попробовать?
Моя конкретная конечная цель
- Настройте ведение журнала с помощью log4j2.xml
- Ведение журнала заканчивается как java.util.logging в консоли
Ответ №1:
К сожалению, я считаю, что если вы используете адаптер log4j-to-slf4j, log4j2.xml конфигурация будет проигнорирована. Любые конфигурации ведения журнала должны быть изменены на стороне вашего сервера в вашем server.xml . В случае фильтрации ваших журналов на основе уровня журнала вы можете использовать атрибут consoleLogLevel . В вашем файле bootstrap.properties:
com.ibm.ws.logging.console.log.level=<log level>
Или в вашем server.xml файл:
<logging consoleLogLevel="<log level>" />
Или в вашей серверной среде:
WLP_LOGGING_CONSOLE_LOGLEVEL=<log level>
Допустимые параметры для уровня журнала включают АУДИТ, ОШИБКУ, ИНФОРМАЦИЮ, ВЫКЛЮЧЕНИЕ, ПРЕДУПРЕЖДЕНИЕ.
Пожалуйста, обратитесь к https://openliberty.io/docs/20.0.0.11/reference/config/logging.html для получения дополнительной информации о том, как настроить ведение журнала в Open Liberty.
Кроме того, вы можете использовать другие параметры, указанные в блоге, для отправки ваших журналов в OCP.
РЕДАКТИРОВАТЬ: другой вариант, который вы могли бы сделать, это использовать консольное приложение вместо этого. Вы можете отправлять журналы своих приложений на консоль напрямую в формате, отличном от json. Если вы хотите вести журнал Liberty в формате JSON и сохранять журналы приложений log4j 2 в формате JSON, вы также можете использовать атрибут ведения журнала appsWriteJson для отправки журналов приложений JSON непосредственно в System.out / err.
bootstrap.properties:
com.ibm.ws.logging.apps.write.json=true
server.xml
<logging appsWriteJson="true"/>
серверная среда:
WLP_LOGGING_APPS_WRITE_JSON=true
Консольные приложения: https://logging.apache.org/log4j/2.x/manual/configuration.html#Appenders
Дополнительная информация о appsWriteJson:
https://openliberty.io/blog/2020/07/30/json-logging-open-liberty-20008.html
Комментарии:
1. Спасибо за разъяснение, я полагаю, вы являетесь автором блога. В настоящее время мы используем ваш метод sidecar с помощью fluentd. Однако нам пришлось взять другое изображение, а затем то, что в сообщении в блоге. В настоящее время эта коляска использует 64 МБ pro app, и у нас около 66 приложений. Вот почему мы хотели попытаться отойти от sidecars и перейти по маршруту слияния в ИЮЛЬ. Однако нам нужно иметь возможность настраивать с помощью xml, поэтому, к сожалению, это больше не вариант: (
2. Отредактировал сообщение выше. Дайте мне знать, является ли это жизнеспособным решением или если у вас все еще есть вопросы.
3. В первой попытке мы попытались использовать атрибут appsWriteJson, но не увидели никаких значимых изменений. Мы открыли дело с IBM. Ответ заключался в том, что это не поддерживается для Log4j / SLF4j. Мы также основывались на блогах, которые вы упомянули здесь. Наша текущая новая настройка использует fluentbit с sidecars, который, похоже, снизил использование памяти sidecar и дает многообещающие результаты.