2016-06-30 2 views
1

Я уже несколько дней стуча головой по этому поводу и не могу понять. Log4j2 обратно совместим, если вы добавите библиотеку совместимости log4j1.Компоненты, написанные против log4j1, не регистрируются после обновления log4j2.

Мой веб-инф \ Lib есть:

  • SLF-апи
  • log4j-1,2-апи (. Назад Compat библиотека)
  • log4j-апи (log4j2)
  • log4j-жильный (log4j2)
  • log4j-полотно (автоматическое подключение для веб-приложений)

Мой web.xml имеет:

<!-- log4j2 auto-wiring --> 
<context-param> 
    <param-name>log4jConfiguration</param-name> 
    <param-value>file:///${catalina.base}/conf/log4j2.xml</param-value> 
</context-param> 

Мой [кот] /conf/log4j2.xml является:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="debug"> 
    <Appenders> 
     <!-- Appends to CONSOLE --> 
     <Console name="consoleAppender" target="SYSTEM_OUT"> 
      <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" /> 
      <PatternLayout pattern="%5p (%F:%L) - %m%n" /> 
     </Console> 
    </Appenders> 
    <Loggers> 
     <Logger name="com.mycompany.componentA" level="WARN" /> 
     <Logger name="com.mycompany.componentA.QueryLogger" level="DEBUG" /> 
     <Logger name="com.mycompany.mycode" level="DEBUG" /> 
     <Root level="WARN"> 
      <AppenderRef ref="consoleAppender" /> 
     </Root> 
    </Loggers> 
</Configuration> 

Я обновил код под моим контролем (com.mycompany.mycode) к log4j2 API, и они работают/журнал безотказно. Код, который не под моим контролем, но был написан против log4j1 (com.mycompany.componentA), просто просто не регистрируется. Нет ошибок, нет отладок, ничего.

Что-то интересное, хотя ... когда я запускаю приложение, я получаю предупреждение log4j1 о некорректных конфигурациях при запуске приложения. Это также претит меня, потому что в WAR нет библиотек log4j1 (кроме API совместимости). Предупреждение:

log4j:WARN No appenders could be found for logger (com.mycompany.componentB) 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

ответ

0

EDIT: Я (наконец) понял, что происходит. Одна из моих зависимостей сделала ужасно плохое и BUNDLED классы log4j1 в финальную банку. Таким образом, в пути к классам нет log4j1, но есть класс log4j1 CLASSES в пути к классам.

Единственный способ, которым я был в состоянии получить эту работу было:

  1. Создание ОБА через конфигурационные файлы log4j1 и log4j2 XML (даже если конфигурация log4j2 содержала все регистраторы, которые я хотел)
  2. Пусть Log4j2 авто-провод себя через артефакт 'log4j-web' артефакт + 'log4jConfiguration' web.xml параметр
  3. Вручную выполните log4j1, вызвав устаревший Log4jConfigurer.initLogging (...) API при запуске сервера

Это, вероятно, ужасно неверно, но, как указано выше, это был единственный способ заставить меня работать после нескольких недель обманывания.

Мое понимание моста lo4j1 заключается в том, что подключение log4j2 и включая мост - все, что должно быть необходимо (например, нет необходимости вручную подключать log4j1). На практике это, похоже, не происходит.

+0

Это подтверждает утверждение Ральфа и мою гипотезу о том, что банда log4j1 все еще находится в пути к классам. –

+0

Обновлен мой ответ другим способом, чтобы найти место для логарифма Log4j 1. –

+0

Нет, это не подтверждает это. Все вызовы API log4j1 подключены к вызовам log4j2. Так что все это действительно подтверждает, что у вас нет больше идеи о том, что случилось, чем я. –

0

Это сообщение об ошибке означает, что в вашем приложении все еще есть банкомат log4j-1.x. Ищите его в своем WEB-INF/lib и удалите его, а затем он должен работать.

+0

В общем, у меня нет библиотек log4j1 в webinf –

+1

Сообщение, которое вы видите, происходит из кода инициализации log4j 1.x, поэтому оно должно быть в classparh где-то. Продолжайте искать, пока не найдете его. – rgoers

0

Если нет в WEB-INF/lib, то, возможно, в вашей папке с общим содержимым (Tomcat?)? Ральф прав, что это сообщение об ошибке генерируется Log4j-1.2, поэтому оно находится в пути к классам ... Попробуйте напечатать значение свойства System java.class.path, если необходимо.


Update: еще один способ найти местоположение фляги Log4j1 является распечатывающими org.apache.log4j.AppenderSkeleton.class.getResource("/org/apache/log4j/AppenderSkeleton.class") из приложения.

(я первоначально предложил Category но также существует в Log4j 1 моста, так AppenderSkeleton лучше.)

+0

Были ли наши ответы полезными? –