说起Java中的日志组件,jcl(Jakarta Commons Logging)、jul(Java Util Logging)、log4j、slf4j、logback、log4j2这些耳熟能详组件。不得不提到一个人,那就是Ceki Gülcü这位大神,是log4j、slf4j、logback的作者。他冷酷无情的几乎包揽了整个Java的日志组件,努力改进日志记录器组件,连sun官方的日志组件方案jul也不得不甘拜下风。有兴趣可以看看《Java日志系统历史从入门到崩溃》一文。
好了,我感觉log4j2诞生是要终结和一统这一切,其实slf4j已经做到了。那么选择log4j2的理由是什么?那只能因为性能改进。在多线程方案中,与Log4j 1.x和Logback相比,异步Logger的吞吐量高18倍,延迟降低了几个数量级。请参见Log4j2异步日志记录性能。
好了,在了解一点点背景和目标的后,我们本着“用就是了”的原则直奔主题。
注意,这里是在spring boot 框架下使用log4j2组件的常用配置。
引入log4j2依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
排除log4j 1.x
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.2.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
注意log4j、slf4j、jcl的桥接器
因为很多其他组件绑定了各种的日志组件,所以配置桥接器是必要的,把不同日志统一接入log4j2的实现上来。
这个spring-boot-starter-log4j2已经配置好了,可以去pom里看一下:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
<scope>compile</scope>