Проблема с настройкой Commons Logging / Log4j в весеннем веб-приложении с tomcat 6

У меня проблема с настройкой ведения журнала в весеннем веб-приложении, развернутом под tomcat 6.

Веб-приложение использует api для общего журнала, во время выполнения следует использовать log4j. Файл журнала создается, но остается пустым - записей в журнале не происходит.

настройка следующая:

WEB-INF / web.xml:

 <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>

WEB-INF / classes / commons-logging.properties:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

WEB-INF / log4j.xml:

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

  <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    ...
  </appender>
  <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="${catalina.home}/logs/my.log"/>
    ...
  </appender>

  <logger name="my.package">
    <level value="INFO"/>
  </logger>

  <root>
    <level value="ERROR"/>
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
  </root>
</log4j:configuration>

Файл logs / my.log создается, но журналы не появляются. Это информационные журналы на консоли tomcat, но не с настроенным шаблоном макета.

Commons-logging-1.1.1.jar и log4j-1.2.14.jar включены в WEB-INF / lib. Есть идеи, что здесь не так?


person Arne Burmeister    schedule 20.10.2008    source источник


Ответы (6)


В сети есть множество задокументированных случаев, когда люди предупреждают об использовании общих журналов. Настолько, что SLF4J набирает большую популярность.

Учитывая, что вы не заинтересованы в использовании Tomcat с Log4j, вам следует просто использовать Log4j непосредственно в своем приложении. В частности, если нет шансов, что вы в будущем переключитесь на фреймворки ведения журналов. Это снизит сложность вашего приложения и избавится от любых проблем с загрузчиком классов, которые возникают при ведении журнала общего пользования.

Это должно быть относительно легким поиском и заменой в вашем тексте, поскольку commons-logging и log4j используют схожую структуру вызовов для своих методов регистрации.

person Spencer Kormos    schedule 20.10.2008
comment
Я думаю, что ведение общего журнала (начиная с версии 1.1, где раньше были ошибки, приводящие к утечкам памяти) - это нормально. Но, возможно, это лучшее решение - просто использовать log4j напрямую, оставив библиотеки, использующие общие журналы, незарегистрированными. - person Arne Burmeister; 20.10.2008
comment
Все это работало в Tomcat 5.5 - иногда дела шли еще хуже - person Arne Burmeister; 20.10.2008
comment
Нет, ведение журнала по-прежнему мусор (2010), используйте slf4j. article.qos.ch/thinkAgain.html - person Manius; 15.08.2010

Будьте особенно осторожны, чтобы не поместить файл log4j.jar в каталог Tomcat commons / lib. Если корневой загрузчик классов загружает библиотеки log4j, вы столкнетесь с конфликтами и проблемами инициализации, когда ваши веб-приложения также попытаются использовать log4j.

Если вам нужно использовать log4j для обычного ведения журнала Tomcat, вам нужно быть осторожным, чтобы ваши веб-приложения также не пытались загрузить log4j. Если у вас есть несколько веб-приложений на сервере, вам потребуется дисциплина, чтобы инициализация журнала каждого веб-приложения не нарушала инициализацию других веб-приложений. Каждое веб-приложение должно использовать уникальные идентификаторы Logger ID, которые могут быть выполнены с помощью уникальных имен пакетов.

Использование общего log4j в Tomcat с несколькими веб-приложениями вызывает серьезные конфликты, когда у вас есть общие библиотеки, которые все хотят вести журнал, например Hibernate или Spring. Следующее веб-приложение, которое пытается инициализировать log4j, может закрыть регистратор предыдущего. Это может быть беспорядок.

person Mojo    schedule 22.10.2008

У меня была аналогичная проблема, и я нашел решение. Запустите tomcat с дополнительным параметром:

-Dorg.apache.commons.logging.LogFactory = org.apache.commons.logging.impl.LogFactoryImpl

person Senthil    schedule 01.04.2011
comment
Сработало у меня !! Спасибо ! Застрял на этом на 1 неделю: P - person Daniel Lavoie; 04.08.2012

Вам необходимо скомпилировать дополнительный компонент для полного ведения журнала общего пользования. По умолчанию Tomcat 6 использует жестко запрограммированную реализацию общего ведения журнала, которая всегда делегирует java.util.logging.

Инструкции по сборке здесь http://tomcat.apache.org/tomcat-6.0-doc/building.html

Затем замените tomcat-juli.jar в каталоге / bin Tomcat и поместите tomcat-juli-adapters.jar в каталог / lib вместе с log4j и config.

person Jonas K    schedule 20.10.2008
comment
Я не хочу, чтобы сам tomcat регистрировался с помощью log4j, только мой веб-приложение. Или есть ошибка загрузчика классов tomcat, не позволяющая вести журнал моих собственных сообществ? - person Arne Burmeister; 20.10.2008
comment
Если Tomcat имеет классы ведения журнала Commons в пути к библиотеке, то они будут загружены до загрузки любых JAR в WEB-INF / lib. - person matt b; 20.10.2008
comment
Проблема заключается в дизайне загрузчика классов в tomcat 6 (Common не должен иметь родительский элемент System). - person Arne Burmeister; 20.10.2008

если вы используете log4j + common logging, вы можете избежать большинства описанных выше конфигураций. общее ведение журнала LogFactory имеет функцию обнаружения, аналогичную JAXP, со следующим приоритетом, поиск реализаций журнала, 1. атрибут конфигурации org.apache.commons.logging.Log внутри файла commons-logging.properties 2. системное свойство org.apache.commons. logging.Log 3. Если Log4J доступен по пути к классу, используйте соответствующий класс-оболочку (Log4JLogger). 4. Jdk14Logger 5. SimpleLog

просто убедитесь, что и common-logging.jar, и common-logging-api.jar, и log4j.jar в пути к классам.

person engineer    schedule 28.09.2010

Может я ошибаюсь. Пожалуйста, попробуйте следующее:

A) Добавьте appender в my.package как: OR B) Уменьшите уровень журнала root до INFO

person AGEORGE    schedule 18.02.2010
comment
Я знаю, что это не так просто настроить log4j. - person Arne Burmeister; 18.02.2010