Проблема с настройкой 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