Проблема с настройкой Commons Logging/Log4j в spring webapp с tomcat 6

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

В Webapp используется ari-logging 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/классы/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>

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

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

Ответы

Ответ 1

Существует множество документированных случаев в Интернете, предупреждающих людей об использовании commons-logging. Настолько, что SLF4J набирает большую популярность.

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Вам необходимо скомпилировать дополнительный компонент для полноценного ведения журнала. По умолчанию Tomcat 6 использует жестко запрограммированную реализацию commons-logging, которая всегда делегирует 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.

Ответ 5

Если вы используете log4j + общий журнал, вы можете избежать большинства вышеперечисленных конфигураций. общий журнал 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 в пути к классам.

Ответ 6

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

A) Добавить appender в my.package как:             <Б > ИЛИ B) Уменьшите лог-лист корня до INFO