Spring Boot:使用logback而不是log4j

Ale*_*ord 2 java logging spring logback

我想通过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>
Run Code Online (Sandbox Code Playgroud)

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

public class MyClass {

    static final Logger LOG = LoggerFactory.getLogger(MyClass.class);
Run Code Online (Sandbox Code Playgroud)

项目启动时,控制台中会显示以下警告:

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.
Run Code Online (Sandbox Code Playgroud)

看起来Spring仍在尝试使用log4j而不是logback.我尝试添加logging.config=classpath:logback.xml到Spring application.properties,但它没有解决问题.

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

更新

@AliDehghani和@chrylis都认为它log4j正被另一个包引用pom.来自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 ...]
Run Code Online (Sandbox Code Playgroud)

我尝试从这样排除log4j(和slf4j)hbase-common:

<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>
Run Code Online (Sandbox Code Playgroud)

该项目未能建立:

[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]
Run Code Online (Sandbox Code Playgroud)

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

@AliDehghani指出,在下面他的回答,那春天开机默认使用的logback等加入logback-core,并logback-classicpom.xml不应该是必要的.我相信他是100%正确的.然而,当我注释掉logback-core,并logback-classicpom.xml我会看到几个警告,如

log4j:ERROR Could not create an Appender. Reported error follows.
java.lang.ClassNotFoundException: ch.qos.logback.core.ConsoleAppender
Run Code Online (Sandbox Code Playgroud)

com*_*nad 7

你已经知道了这一点,但我想把它包起来并概括......


有这三个日志框架:

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

你必须手动抛出log4j并用兼容性桥替换它log4j-over-slf4j.

有一个slf4j后端叫logback-classic.


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>
Run Code Online (Sandbox Code Playgroud)

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 = "*")
  ))
Run Code Online (Sandbox Code Playgroud)