加载 DOM 库时 log4j 发生冲突? (不允许在类路径中使用其他 dom 实现?)
我正在尝试将 log4j 放入 Tomcat 7 中的 Web 应用程序中。
我的 Web 应用程序的 WEB-INF\lib
中有 log4j 库。
我在 WEB-INF\classes
下有以下 log4j.xml
<?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>
我登录例如我知道正在加载的 servlet 或过滤器,但我在任何地方都看不到输出日志。
例如
Logger log = Logger.getLogger(MyFilter.class);
并在 doFilter
中记录即 log.debug("logging information); log.error("日志信息);
由于控制台 appender
,我无法在 Tomcat 控制台中看到输出,并且我没有看到创建的 myLogfile.log
任何一个。
我不确定该文件应该在哪里创建。
我只看到来自 servlet 和过滤器的 System.out
语句。
我在这里做错了什么?
更新:
我在类路径 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(未知 来源) 在 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(来源未知) 在 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) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在 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.LifecycleBase.start(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.run(HostConfig.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) 在 java.lang.Thread.run(Thread.java:662) 引起:java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533) ... 48 更多
log4j:WARN 找不到记录器 (com.test.MyFilter) 的附加程序。 log4j:WARN 请正确初始化 log4j 系统。 log4j:警告 请参阅 http://logging.apache.org/log4j/1.2/faq.html#noconfig 了解更多信息。
I am trying to put log4j in a web application in Tomcat 7.
I have the log4j library in the WEB-INF\lib
of my web application.
I have the following log4j.xml under 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>
I log e.g. in a servlet or filter that I know are loading but I can not see the output log anywhere.
E.g.
Logger log = Logger.getLogger(MyFilter.class);
and in doFilter
I log i.e. log.debug("logging information); log.error("logging information);
I can not see the output in the Tomcat console as a result of the console appender
and I don't see the myLogfile.log
created either.
I am not sure where is this file supposed to be created.
I see only System.out
statements from servlets and filters.
What am I doing wrong here?
UPDATE:
I have in the classpath xercesImpl.jar
and jaxb-impl.jar
. Could this cause an issue?
I noticed the following exception I missed earlier in Tomcat console:
log4j:WARN Error during default initialization
java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2823)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1160)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1655)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533)
at org.apache.xerces.parsers.AbstractDOMParser.startDocument(Unknown
Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.startDocument(Unknown
Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(Unknown
Source)
at org.apache.xerces.impl.XMLVersionDetector.startDocumentParsing(Unknown
Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at org.apache.log4j.xml.DOMConfigurator$2.parse(DOMConfigurator.java:767)
at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:866)
at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:773)
at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483)
at org.apache.log4j.LogManager.(LogManager.java:127)
at org.apache.log4j.Logger.getLogger(Logger.java:117)
at com.test.MyFilter.(MyFilter.java:26)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:125)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:256)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:103)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4624)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5281)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:866)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:842)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617)
at 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$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533)
... 48 morelog4j:WARN No appenders could be found for logger (com.test.MyFilter).
log4j:WARN Please initialize the log4j system properly. log4j:WARN See
http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
可能只是在这里,但您缺少结束
对于文件,您可以这样写:
或者
您如何登录您的 servlet 类?举一个导入和句子的例子
我猜你正在做这样的事情,不是吗?
: 更新:
问题是在尝试解析 Log4j XML 时类加载器中缺少依赖项,而不是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
Probably is only here, but you are missing the closing
</log4j:configuration>
And for the file you can write this:
or
How are you logging in your servlet classes? Put an example of the import and the sentences
I guess you are doing something like this, isnt?:
UPDATE:
The problem is a missing dependency in the class loader when trying to parse the Log4j XML, not a problem in the Log4j configuration.
The log shows that
org/w3c/dom/ElementTraversal
is missing. HavingxercesImpl.jar
already, the xml-apis.jar is neededAs stated here http://xerces.apache.org/xerces2-j/install.html the old xerces.jar contained all classes in one jar, but new distribution of xerces divides it in
xercesImpl.jar
andxml-apis.jar
Quoted:
xerces.jar is no longer available in the main distribution. You can still download this jar from deprecated distribution. xerces.jar is a Jar file that contains all the parser class files (i.e., it contains the intersection of the contents of xercesImpl.jar and xml-apis.jar).
To use another XML parser just remove xercesImpl.jar and add another implementation library. The problem was only the use of xercesimpl.jar without xml-apis.jar
我想分享我的经验,解决一个与此非常相似的问题,但使用上面的答案没有解决这个问题,也许有时有人会有相同的经历。
在我的例子中,log4j 无法解析 log4j 属性文件的 xml 版本,即使项目包含 xerces 和 xml-apis,也会发生这种情况。
我发现,当我们升级一个包含的软件包(selenium 2.28)时,包含的 xerces 软件包已包含在内,但由于某种原因对 log4j 不可见。
我通过仅包含 xerces 2.10 而不是 xml-api 解决了这个问题。
请注意,这是一种特殊情况,如果上述提示不起作用,您应该将此作为最后的手段进行测试。
+1 上面的答案帮助我找到了我的问题。
另一件对我帮助很大的事情是 -Dlog4j.debug VM 参数,它显示 log4j 找到 log4j.xml 文件等。
I would like to share my experience with a problem very similar to this one that wasn't solved by using the answers above, maybe someone will have the same experience sometime.
In my case log4j wasn't able to parse the xml version of the log4j property file and this happened even though the project contained both xerces and xml-apis.
I turned out that when we upgraded one included package (selenium 2.28) the included xerces package was included but not visible to log4j for some reason.
I solved that by including only the xerces 2.10 and not the xml-apis.
Please note that this is a special case and you should test this as a last resort if the tips above doesn't work.
+1 to the answer above that helped me find my issue.
Another thing that helped me a lot was the -Dlog4j.debug VM argument which shows that log4j finds the log4j.xml file and more.
将 log4j jar 文件移动到 tomcat 服务器 lib 文件夹中。
将 log4j.xml 移动到 /src 文件夹中。
构建 war 文件时,log4j.xml 将自动放置在 war 中。
Move log4j jar file into tomcat server lib folder.
Move log4j.xml into the /src folder.
While building the war file, the log4j.xml will be placed inside the war automatically.