【问题标题】:Spring Boot: use logback instead of log4jSpring Boot:使用 logback 而不是 log4j
【发布时间】:2016-04-24 03:42:55
【问题描述】:

我想在 Spring Boot 项目中使用 Logback,因为它的性能和灵活性。我将 Logback 依赖项添加到 pom.xml:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.3</version>
</dependency>

...并确保我项目中每个类中的日志记录是这样创建的:

public class MyClass {

    static final Logger LOG = LoggerFactory.getLogger(MyClass.class);

项目启动时,控制台显示如下警告:

log4j:WARN No appenders could be found for logger (org.springframework.boot.logging.ClasspathLoggingApplicationListener).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

似乎 Spring 仍在尝试使用 log4j 而不是 logback。我尝试将 logging.config=classpath:logback.xml 添加到 Spring application.properties,但并没有解决问题。

你能看出我做错了什么吗?

更新

@AliDehghani 和@chrylis 都建议log4jpom 中的另一个包引用。 mvn dependency:tree 的输出确认 hbase-common 是源:

com.woolford:my-project:jar:1.0-SNAPSHOT
+- org.apache.hbase:hbase-common:jar:1.1.2:compile
|  [... etc ...]
|  +- commons-logging:commons-logging:jar:1.2:compile
|  [... etc ...]
|  +- org.apache.hadoop:hadoop-common:jar:2.5.1:compile
|  [... etc ...]
|  |  +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile
|  |  \- com.jcraft:jsch:jar:0.1.42:compile
|  +- org.apache.hadoop:hadoop-mapreduce-client-core:jar:2.5.1:compile
|  [... etc ...]
|  +- log4j:log4j:jar:1.2.17:compile
|  [... etc ...]
\- org.apache.hbase:hbase-client:jar:1.1.2:compile
   [... etc ...]

我尝试从hbase-common 中排除log4j(和slf4j),如下所示:

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-common</artifactId>
    <version>1.1.2</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

项目构建失败:

[ERROR] Failed to execute goal on project my-project: Could not resolve dependencies for project com.woolford:my-project:jar:1.0-SNAPSHOT: The following artifacts could not be resolved: javax.jms:jms:jar:1.1, com.sun.jdmk:jmxtools:jar:1.2.1, com.sun.jmx:jmxri:jar:1.2.1: Could not transfer artifact javax.jms:jms:jar:1.1 from/to java.net (https://maven-repository.dev.java.net/nonav/repository): Cannot access https://maven-repository.dev.java.net/nonav/repository with type legacy using the available connector factories: BasicRepositoryConnectorFactory: Cannot access https://maven-repository.dev.java.net/nonav/repository with type legacy using the available layout factories: Maven2RepositoryLayoutFactory: Unsupported repository layout legacy -> [Help 1]

我尝试将这些依赖项添加到 pom.xml,但这没有帮助。

@AliDehghani 在下面的回答中指出,Spring Boot 默认使用 Logback,因此不需要将 logback-corelogback-classic 添加到 pom.xml 中。我敢肯定他是100%正确的。但是,当我在 pom.xml 中注释掉 logback-corelogback-classic 时,我看到了几个警告,例如

log4j:ERROR Could not create an Appender. Reported error follows.
java.lang.ClassNotFoundException: ch.qos.logback.core.ConsoleAppender

【问题讨论】:

  • 是否还有其他依赖项也引入了 log4j?您可能需要排除它。

标签: java spring logging logback


【解决方案1】:

你已经知道了,但我想总结一下并概括一下......


有以下三个日志框架:

  • log4j(古)
  • slf4j(到处都用的api,有不同的后端可用)
  • logback(有很好的功能和配置,slf4j 的继任者)

您必须手动丢弃log4j,并用兼容桥log4j-over-slf4j 替换它。

有一个名为 logback-classicslf4j 后端。


mvn:

<dependency>
    <!-- legacy log4j ==> slf4j -->
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.21</version>
</dependency>
<dependency>
    <!-- slf4j ==> logback -->
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>...no maintainer...</groupId>
    <artifactId>...old stuff...</artifactId>
    <version>...ancient...</version>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

sbt:

libraryDependencies ++= Seq(
    Seq(...),
    Seq(
      "org.slf4j" % "log4j-over-slf4j" % "1.7.21",   // legacy log4j --> slf4j
      "ch.qos.logback" % "logback-classic" % "1.1.7" // slf4j --> logback
    )
  ).flatten.map(_.excludeAll(
    ExclusionRule(organization = "log4j", name = "log4j", artifact = "*"),
    ExclusionRule(organization = "org.slf4j", name = "slf4j-log4j12", artifact = "*")
  ))

【讨论】:

    【解决方案2】:

    Spring Boot 默认使用 Logback 进行日志记录。无需显式添加:

    默认情况下,如果你使用“Starter POMs”,Logback 将用于 记录。还包括适当的 Logback 路由,以确保 使用 Java Util Logging、Commons Logging、Log4J 的依赖库 或 SLF4J 都会正常工作。

    您还可以通过在application.properies 中使用logging.level.*=LEVEL 来更改日志级别。

    【讨论】:

    • 将您的完整 pom.xml 添加到问题中。也许其他一些依赖项也引入了 log4j。
    • org.apache.hbase:hbase-common -> log4j:log4j
    • 显然,HBase 依赖于log4j。从 Hbase 依赖声明中排除 log4j 依赖。
    猜你喜欢
    • 2016-10-30
    • 2015-05-11
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多