Конфликт в log4j при загрузке библиотек для DOM?(Другие реализации dom в classpath не разрешены?) - PullRequest
2 голосов
/ 12 января 2012

Я пытаюсь поместить log4j в веб-приложение в Tomcat 7.
У меня есть библиотека log4j в WEB-INF\lib моего веб-приложения.
У меня есть следующий log4j.xml под WEB-INF\classes

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

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

      <!-- Log output to Console -->
      <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
        <param name="Target" value="System.out"/> 
        <layout class="org.apache.log4j.PatternLayout"> 
          <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/> 
        </layout> 
      </appender>  

      <appender name="rolling" class="org.apache.log4j.RollingFileAppender"> 
        <param name="file" value="myLogfile.log"/>    
        <param name="append" value="true" />
        <param name="encoding" value="UTF-8" />  
        <layout class="org.apache.log4j.PatternLayout"> 
          <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/> 
        </layout> 
      </appender> 

      <!-- Log to both Console and File -->
      <root> 
        <priority value ="debug" /> 
        <appender-ref ref="console" /> 
        <appender-ref ref="rolling" />
      </root>  
</log4j:configuration>

Я вхожу, например. в сервлете или фильтре, которые я знаю, загружаются, но я нигде не вижу выходной журнал.

например.

Logger log = Logger.getLogger(MyFilter.class);

и в doFilter я вхожу, т.е. log.debug("logging information); log.error("logging information);

Я не вижу вывод в консоли Tomcat в результате работы консоли appender и не вижу созданного myLogfile.log.

Я не уверен, где этот файл должен быть создан.

Я вижу только System.out операторов из сервлетов и фильтров.

Что я здесь не так делаю?

UPDATE:
У меня в classpath xercesImpl.jar и jaxb-impl.jar. Может ли это вызвать проблемы?

Я заметил следующее исключение, которое пропустил ранее в консоли Tomcat:

log4j: WARN Ошибка при инициализации по умолчанию java.lang.NoClassDefFoundError: org / w3c / dom / ElementTraversal в java.lang.ClassLoader.defineClass1 (собственный метод) в java.lang.ClassLoader.defineClassCond (ClassLoader.java:631) в java.lang.ClassLoader.defineClass (ClassLoader.java:615) в java.security.SecureClassLoader.defineClass (SecureClassLoader.java:141) в org.apache.catalina.loader.WebappClassLoader.findClassInternal (WebappClassLoader.java:2823) в org.apache.catalina.loader.WebappClassLoader.findClass (WebappClassLoader.java:1160) в org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java:1655) в org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java:1533) в org.apache.xerces.parsers.AbstractDOMParser.startDocument (Неизвестно Источник) at org.apache.xerces.impl.dtd.XMLDTDValidator.startDocument (Неизвестно Источник) в org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity (Неизвестно Источник) в org.apache.xerces.impl.XMLVersionDetector.startDocumentParsing (Неизвестно Источник) в org.apache.xerces.parsers.XML11Configuration.parse (неизвестный источник) в org.apache.xerces.parsers.XML11Configuration.parse (неизвестный источник) в org.apache.xerces.parsers.XMLParser.parse (Неизвестный источник) в org.apache.xerces.parsers.DOMParser.parse (неизвестный источник) at org.apache.xerces.jaxp.DocumentBuilderImpl.parse (неизвестный источник) в org.apache.log4j.xml.DOMConfigurator $ 2.parse (DOMConfigurator.java:767) в org.apache.log4j.xml.DOMConfigurator.doConfigure (DOMConfigurator.java:866) в org.apache.log4j.xml.DOMConfigurator.doConfigure (DOMConfigurator.java:773) в org.apache.log4j.helpers.OptionConverter.selectAndConfigure (OptionConverter.java:483) в org.apache.log4j.LogManager. (LogManager.java:127) в org.apache.log4j.Logger.getLogger (Logger.java:117) на com.test.MyFilter. (MyFilter.java:26) at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:27) в java.lang.reflect.Constructor.newInstance (Constructor.java:513) в java.lang.Class.newInstance0 (Class.java:355) в java.lang.Class.newInstance (Class.java:308) в org.apache.catalina.core.DefaultInstanceManager.newInstance (DefaultInstanceManager.java:125) в org.apache.catalina.core.ApplicationFilterConfig.getFilter (ApplicationFilterConfig.java:256) в org.apache.catalina.core.ApplicationFilterConfig.setFilterDef (ApplicationFilterConfig.java:382) в org.apache.catalina.core.ApplicationFilterConfig. (ApplicationFilterConfig.java:103)в org.apache.catalina.core.StandardContext.filterStart (StandardContext.java:4624) в org.apache.catalina.core.StandardContext.startInternal (StandardContext.java:5281) в org.apache.catalina.util.startBase(LifecycleBase.java:150) в org.apache.catalina.core.ContainerBase.addChildInternal (ContainerBase.java:866) в org.apache.catalina.core.ContainerBase.addChild (ContainerBase.java:842) в org.apache.catalina.core.StandardHost.addChild (StandardHost.java:615) в org.apache.catalina.startup.HostConfig.deployDirectory (HostConfig.java:1095) в org.apache.catalina.startup.HostConfig $ DeployDirectory.Java: 1617) в java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:441) в java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:303) в java.util.concurrent.FutureTask.run (FutureTask.java:138) в java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java: 908) at java.lang.Thread.run (Thread.java:662). Причина: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal в org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java: 1688) at org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java:1533) ... еще 48

log4j: ПРЕДУПРЕЖДЕНИЕ Не удалось найти ни одного добавочного файла для регистратора (com.test.MyFilter)).log4j: WARN Пожалуйста, правильно инициализируйте систему log4j.log4j: WARN См. http://logging.apache.org/log4j/1.2/faq.html#noconfig для получения дополнительной информации.

Ответы [ 3 ]

13 голосов
/ 12 января 2012

Возможно, только здесь, но вы пропускаете закрытие </log4j:configuration>

А для файла вы можете написать так:

<param name="file" value="/usr/logs/myLogfile.log"/>

или

<param name="file" value="c:/logs/myLogfile.log"/>

Как вы входите в свои классы сервлетов? Поставь пример импорта и предложения

Полагаю, вы делаете что-то подобное, не так ли?:

import org.apache.log4j.Logger;

private Logger log = Logger.getLogger(name);
log.debug("Mensaje de debug");

UPDATE:

Проблема в отсутствующей зависимости в загрузчике классов при попытке анализа XML Log4j, а не в конфигурации Log4j. Журнал показывает, что org/w3c/dom/ElementTraversal отсутствует. Имея уже xercesImpl.jar, необходим xml-apis.jar

Как указано здесь http://xerces.apache.org/xerces2-j/install.html старый xerces.jar содержал все классы в одном jar, но новое распределение xerces делит его на xercesImpl.jar и xml-apis.jar

Цитируется:

xerces.jar больше не доступен в основном дистрибутиве. Вы все еще можете скачать этот jar из устаревшего дистрибутива. xerces.jar - это файл Jar, содержащий все файлы классов анализатора (т.е. он содержит пересечение содержимого xercesImpl.jar и xml-apis.jar).

Чтобы использовать другой анализатор XML , просто удалите xercesImpl.jar и добавьте другую библиотеку реализации. Проблема заключалась только в использовании xercesimpl.jar без xml-apis.jar

2 голосов
/ 18 января 2013

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

В моем случае log4j не был 'не удалось проанализировать xml-версию файла свойств log4j, и это произошло, хотя проект содержал и xerces и xml-apis.

Я обнаружил, что когда мы обновили один включенный пакет (селен 2.28) включенный пакет xerces был включен, но почему-то не виден в log4j.

Я решил, что включив only xerces 2.10, а не xml-apis.

Обратите внимание, что это особый случай, и вам следует проверить его как последнее средство, если приведенные выше советы не сработают.

+ 1 к ответу выше, который помог мне найти мою проблему.

Еще одна вещь, которая мне очень помогла, это аргумент виртуальной машины -Dlog4j.debug, который показывает, что log4j находит файл log4j.xml и многое другое.

0 голосов
/ 12 января 2012

Переместить файл jar log4j в папку lib сервера tomcat. Переместите log4j.xml в папку / src.

При создании файла войны файл log4j.xml автоматически помещается в войну.

...