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

Maven依赖和日志记录-Slf4j和Log4j

姚子石
2023-03-14
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
    <!-- <scope>provided</scope> -->
    </dependency>

    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
    <!-- <scope>provided</scope> -->
</dependency>

但是,部署在同一台服务器上的一些其他项目使用Tomcat的lib目录中存在的slf4j和log4j库,我无法删除这些库。

Tomcat lib目录中存在的Slf4J和Log4J版本

SLF4J-API-1.4.2

当我从Tomcat的lib目录中删除这些库并使用project的pom中提到的库时,我的项目运行良好

当我注释项目的pom文件中的依赖项并使用下面Tomcat的lib中的依赖项时,会引发异常

> SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:128)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:107)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:295)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:131)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:657)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:282)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

>May 21, 2014 11:57:27 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error listenerStart
May 21, 2014 11:57:27 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/onevalue] startup failed due to previous errors
May 21, 2014 11:57:27 AM org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
May 21, 2014 11:57:27 AM org.apache.catalina.core.StandardContext listenerStop
SEVERE: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.ExceptionInInitializerError
    at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:116)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4837)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5484)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.IllegalStateException: org.slf4j.LoggerFactory could not be successfully initialized. See also http://www.slf4j.org/codes.html#unsuccessfulInit
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:303)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:131)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:657)
    at org.springframework.web.context.ContextCleanupListener.<clinit>(ContextCleanupListener.java:43)
    ... 12 more

我还尝试使用“提供”的maven scope,同时将库保留在Tomcat的lib目录中。虽然项目运行了,但现在日志机制不起作用,没有创建日志,甚至system.out.println()也无法在控制台窗口上打印任何内容

共有1个答案

卫建义
2023-03-14

似乎您需要将项目降级为SLF4J1.4.2,以使用Tomcat中可用的log4j。它们是二进制不兼容的。之后,您还可以保留 提供的 ,这样就不会同时包含它们。

另一种方法是让其他项目包含库本身并从tomcat Common中删除。我知道Tomcat上没有其他的排除机制。

作为参考,我目前在weblogic上进行了部署,它有一个部署规范,允许排除服务器公共类,转而使用绑定类,例如下面的片段(带有参考)

<wls:prefer-application-packages>
<!-- http://blog.terrencemiao.com/archives/annoying-slf4j-problem-in-weblogic-server-12c -->
  <wls:package-name>org.slf4j</wls:package-name>
    </wls:prefer-application-packages>
 类似资料:
  • 问题内容: 我尝试构建基于Java的应用程序。 对于依赖项注入,我使用Google Guice。 现在我想到了在应用程序中记录一些信息的问题。我不是在谈论方法调用等方式的常规日志记录。我对AOP有所了解,并且我可以像这样进行方法调用跟踪。 我要寻找的是手动记录。我需要某种方式登录应用程序中的几乎每个类。所以我考虑了两个选择: 通过使用Guice注入框架通过构造函数(或setter或private

  • 我使用本教程使用SLF4J设置log4j2。这是我的全部pom.xml:

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

  • 希望是一个简单的问题,但我的google foo让我失望了--我有一个maven项目,我们在其中使用了SLF4J和Log4J1.2绑定。 我们现在想要转移到Log4J2,特别是为了提高性能--但是,我一辈子都找不到Log4J2.0绑定的maven依赖项。我在http://logging.apache.org/log4j/2.x/log4j-SLF4j-impl/上找到了一些注释,但没有提到任何依赖

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

  • 我在Weblogic服务器上运行一个web应用程序(我并不熟悉)。 通过JVM args将带有日志级调试的log4j配置传递给应用程序。在日志文件中,我还可以找到一些调试级别的日志条目。 到目前为止还不错。 在调试期间,我发现一些对logger.debug()的调用不在日志文件中。 如果在调试过程中执行一步,我会在记录器:org.slf4j.impl.jdk14LoggerAdapter(com.