加载DOM库时log4j中的冲突? (不允许在classpath中实现dom的其他实现?)

我试图将log4j放在Tomcat 7中的Web应用程序中。
我在我的Web应用程序的WEB-INF\lib中有log4j库。
我在WEB-INF\classes下面有以下log4j.xml

                          

我在例如我知道正在加载的servlet或filter中进行登录但是我无法在任何地方看到输出日志。

例如

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

doFilter我记录了log.debug("logging information); log.error("logging information);

作为控制台appender的结果,我无法在Tomcat控制台中看到输出,也没有看到myLogfile.log创建。

我不确定这个文件应该在哪里创建。

我只看到来自servlet和filter的System.out语句。

我在这做错了什么?

更新:
我在类路径xercesImpl.jarjaxb-impl.jar 。 这会导致问题吗?

我注意到我之前在Tomcat控制台中错过了以下exception:

log4j:WARN在java的java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)的java.lang.ClassLoader.defineClass1(本地方法)中的默认初始化java.lang.NoClassDefFoundError:org / w3c / dom / ElementTraversal期间出错。位于org.apache的org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2823)的java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)中的lang.ClassLoader.defineClass(ClassLoader.java:615) .appalina.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.impl.XMLDocumentScannerImpl.startEntity的org.apache.xerces.impl.dtd.XMLDTDValidator.startDocument(未知来源)的org.apache.xerces.parsers.AbstractDOMParser.startDocument(未知来源)(未知来源)org.apache.xerces.impl.XMLVersionDetector.startDocume 来自org.apache.xerces.parsers.XMLParser.parse的org.apache.xerces.parsers.XML11Configuration.parse(未知来源)的org.apache.xerces.parsers.XML11Configuration.parse(未知来源)的ntParsing(未知来源)(位于org.apache.jache上的org.apache.xerces.parsers.DOMParser.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。 org.apache.log4j.LogManager。(LogManager.java:127)的helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483)位于com.test的org.apache.log4j.Logger.getLogger(Logger.java:117)。 MyFilter。(MyFilter.java:26)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)at sun.re flect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27),位于java.lang.Class的java.lang.Class.newInstance(Class.java:355)java.lang.reflect.Constructor.newInstance(Constructor.java:513) org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:125)中的.newInstance(Class.java:308)org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:256)at org。位于org.apache.catalina.core.ApplicationFilterConfig。(ApplicationFilterConfig.java:103)的apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)位于org.apache.catalina.core.StandardContext.filterStart(StandardContext.java) :4624)org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5281)org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)org.apache.catalina.core。 ContainerBase.addChildInternal(ContainerBase.java:866)位于org.apache.catalina.core.ContainerBase。 addgild(ContainerBase.java:842)位于org.apache的org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095) .catalina.startup.HostConfig $ DeployDirectory.run(HostConfig.java:1617)java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:441)at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask) .java:303)at java.util.concurrent.FutureTask.run(FutureTask.java:138)at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor $ java.lang.Thread.run中的Worker.run(ThreadPoolExecutor.java:908)(Thread.java:662)由org.apache.catalina.loader中的java.lang.ClassNotFoundException:org.w3c.dom.ElementTraversal引起。 webappClassLoader.loadClass(WebappClassLoader.java:1688)位于org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533)… 48更多

log4j:WARN找不到logger(com.test.MyFilter)的appender。 log4j:WARN请正确初始化log4j系统。 log4j:WARN有关详细信息,请参阅http://logging.apache.org/log4j/1.2/faq.html#noconfig 。

可能只是在这里,但你错过了结束

对于该文件,您可以这样写:

  

要么

  

你是如何登录servlet类的? 举一个导入和句子的例子

我想你正在做这样的事情,不是吗?:

 import org.apache.log4j.Logger; private Logger log = Logger.getLogger(name); log.debug("Mensaje de debug"); 

更新:

问题是在尝试解析Log4j XML时类加载器中缺少依赖性,而不是Log4j配置中的问题。 日志显示缺少org/w3c/dom/ElementTraversal 。 已经有xercesImpl.jar,需要xml-apis.jar

如此处所述http://xerces.apache.org/xerces2-j/install.html旧的xerces.jar包含一个jar中的所有类,但xerces的新分发将其分为xml-apis.jarxml-apis.jar

引:

xerces.jar在主发行版中不再可用。 您仍然可以从弃用的分发版下载此jar。 xerces.jar是一个包含所有解析器类文件的Jar文件(即,它包含xercesImpl.jar和xml-apis.jar的内容的交集)。

使用另一个XML解析器,只需删除xercesImpl.jar并添加另一个实现库。 问题只是在没有xml-apis.jar的情况下使用xercesimpl.jar

我想分享我的经验与一个非常类似的问题,这个问题没有通过使用上面的答案解决,也许有人会在某个时候有相同的经验。

在我的情况下,log4j无法解析log4j属性文件的xml版本,即使项目包含xerces和xml-apis,也会发生这种情况。

我发现,当我们升级一个包含的包(selenium 2.28)时,包含的xerces包被包含但由于某种原因对log4j不可见。

我通过包含xerces 2.10而不是xml-apis来解决这个问题。

请注意,这是一个特殊情况,如果上述提示不起作用,您应该将此作为最后的手段进行测试。

+1上面的答案帮助我找到了我的问题。

另一件对我有帮助的事情是-Dlog4j.debug VM参数,该参数显示log4j找到了log4j.xml文件等等。

将log4j jar文件移动到tomcat服务器lib文件夹中。 将log4j.xml移动到/ src文件夹中。

在构建war文件时,log4j.xml将自动放入war中。