Java Spring引导:使用logback而不是log4j
出于性能和灵活性的考虑,我想使用Spring Boot项目。我将Logback依赖项添加到Java Spring引导:使用logback而不是log4j,java,spring,logging,logback,Java,Spring,Logging,Logback,出于性能和灵活性的考虑,我想使用Spring Boot项目。我将Logback依赖项添加到pom.xml: <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.3</version> </dependency> <dependen
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>
项目启动时,控制台中将显示以下警告:
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
添加到Springapplication.properties
,但没有解决问题
你能看出我做错了什么吗
更新
@alideghani和@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 ...]
我尝试将log4j
(和slf4j
)从hbase common
中排除,如下所示:
public class MyClass {
static final Logger LOG = LoggerFactory.getLogger(MyClass.class);
<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>
我尝试将这些依赖项添加到pom.xml
,但没有帮助
@AliDehghani在下面的回答中指出,Spring Boot默认使用Logback,因此无需在pom.xml
中添加Logback核心
和Logback经典
。我相信他是百分之百正确的。然而,当我在pom.xml
中注释掉logbackcore
和logbackclassic
时,我看到了几个警告,例如:
log4j:ERROR Could not create an Appender. Reported error follows.
java.lang.ClassNotFoundException: ch.qos.logback.core.ConsoleAppender
默认情况下,Spring引导使用Logback进行日志记录。无需明确添加: 默认情况下,如果您使用“Starter POMs”,则将使用Logback进行 登录中。还包括适当的回写路由,以确保 使用javautil日志、Commons日志、Log4J的依赖库 否则SLF4J将全部正常工作
您还可以通过在
应用程序中使用logging.level.*=level
来更改日志级别。properties
您已经知道这一点,但我想总结一下并概括一下
有以下三种日志框架:
(古代)log4j
(到处都使用api,有不同的后端可用)slf4j
(具有良好的功能和配置,是logback
的继承者)slf4j
log4j
,并将其替换为兼容桥log4j-over-slf4j
有一个名为logbackclassic
的slf4j
后端
mvn:
是否还有其他依赖关系也在使用log4j?您可能需要排除它。将完整的
pom.xml
添加到问题。可能还有其他的依赖关系也会影响log4j。org.apache.hbase:hbase common
->log4j:log4j
显然,hbase
依赖于log4j
。从Hbase依赖项声明中排除log4j依赖项。让我们来看看。
log4j:ERROR Could not create an Appender. Reported error follows.
java.lang.ClassNotFoundException: ch.qos.logback.core.ConsoleAppender
<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>
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 = "*")
))