log4j-to-slf4j не отвечает log4j2.xml

#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 и дает многообещающие результаты.