当前位置: 首页 > 知识库问答 >
问题:

尝试在webapp中使用log4j时,使用log4j、commons日志和tomcat7获取NoClassDefFoundError

刘英彦
2023-03-14

我正在做一个Java/J2EE项目,其中有几个Web应用程序。我想在一些webapps中介绍log4j。所以我添加了log4j-1.2。WEB-INF\lib中的16.jar和log4j。WEB-INF\classes中的属性

结果我得到一个NoClassDefFoundError:

org.apache.commons.logging.LogConfigurationException:org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@f8f541 for org.apache.commons.logging.impl.Log4JLogger (Caused by java.lang.NoClassDefFoundError: org/apache/log4j/Category) (Caused by org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@f8f541 for org.apache.commons.logging.impl.Log4JLogger (Caused by java.lang.NoClassDefFoundError: org/apache/log4j/Category))
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)

当我试图直接在Tomcat内部安装log4j时,我也会遇到同样的错误。(我已经在tomcat/lib等中添加了propers jar…就像这里说的:http://tomcat.apache.org/tomcat-7.0-doc/logging.html#Using_Log4j)

我发现这个错误可能来自类加载器问题,因为第三方中包含了一个commons.loggingjar。事实上,当我在第三方删除这个罐子时,NoClassDefFoundError就消失了。([第三方]/bin/commons-logging-1.0.4.jar)。

但是我不能从第三方移除这个罐子,它是在其他地方使用的。

是否可以将commons日志配置为在加载时忽略log4j,或者是否有其他方法来克服这个类加载器问题?

我尝试使用log4j-1.2.16.jar,第三方包含commons-logging-1.0.4.jar.我的log4j.properties文件是apache在上一个链接中建议的默认文件。

共有2个答案

岳晟
2023-03-14

在您的proGuard中添加以下定义。这肯定会解决的

-keep class com.amazonaws.org.apache.commons.logging.** { *; }
赖杰
2023-03-14

你需要重新阅读你引用的文件。

引自http://tomcat.apache.org/tomcat-7.0-doc/logging.html#Using_Log4j

注意:当您想要重新配置Tomcat以使用Apache log4j作为自己的日志记录时,需要使用本节中描述的步骤。如果您只想在自己的Web应用程序中使用log4j,则不需要这些步骤。-在这种情况下,只需将log4j.jar和log4j.properties放入Web应用程序的WEB-INF/lib和WEB-INF/类中。

 类似资料:
  • 我有一个在Jetty 9.3.6上运行的webapp,在中设置为。我的webapp使用,我使用作为实际的日志框架,因此我的webapp源代码中的日志语句如下所示: 在我的 gradle 构建文件中,我这样做了: 此配置适用于另一个(非 Jetty,非 web 应用程序)Java 项目,该项目使用相同的日志记录框架;我可以使用 来控制日志的输出。 无论如何,当我搬到Jetty时,我按照这里的说明进行

  • 我目前正在启动一个新的Webapp(在tomcat 6上运行)。我有使用slf4j的组件和使用commons日志的组件。我计划使用log4j 2.0作为日志实现,原因有几个(主要针对Appender:SocketAppender和SyslogAppender,但也因为在不丢失日志事件的情况下升级配置重新加载) 现在我的问题是:-我应该用哪个接口来编程我的新类?loag4j还是slf4j?或者甚至是

  • 我在WebApp中使用log4j,并验证字段为false。 当我通过以下方式登录时: PS:当webApp重新启动时没有问题。重新启动时,所有内容都清除了。但是当webApp连续运行几天,threadLocals的大小不断增加时,这是一个问题。

  • 当我在Wildfly10上部署war时,Log4j日志不会打印。1.0.最终的不过,它与Tomcat配合得很好。 我在网上发现Wildfly使用log4j,所以我在jboss部署结构中排除了log4j。下面的xml避免了依赖冲突,但没有运气。 下面是我log4.properties档案 下面是我的pom。xml依赖关系 下面是我部署战争时得到的错误日志。 我正在尝试运行独立的完整ha。xml

  • 我有一个spring boot web应用程序。正在尝试自定义日志记录。我理解slf4j和Log4J的区别。在本例中,我需要使用log4j。在很大程度上它是按我的意愿运作的。 我还不知道jboss或hibernate是如何配置的。我是新手,所以如果您能提供一个合理的详细描述,说明如何实现您建议的解决方案,我将非常感激。 更新:有人问,是的,我正在使用Maven。我按照Spring Boot页面上的

  • 问题内容: 我已经将一个Web应用程序部署到服务器上。我的应用程序使用和。但是,并非所有日志记录消息都已写入文件。 在我的课堂上,我有: 我的文件在本地计算机上运行良好,并且已正确部署。 我看到正在写入的应用程序生成的错误消息没有写入我的。由于输出模式的格式与我的模式不同,因此看起来的日志消息来自其他日志框架。我在中看到的日志记录如下: 我的log4j模式是这样的: 一些日志记录出现在我的文件日志