在 springboot 中使用 log4j 需要引入其依赖并把 springboot 自带的日志框架 logback 排除掉:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
=============================================================================
引入log4j2(同log4j一样,要排除 springboot 自带的日志框架):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 增加识别yaml格式依赖,加上这个才能辨认到log4j2.yml文件 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
log4j2 异步日志
到目前为止,上述的测试都是针对同步日志进行的测试。在确定了log4j2
作为日志框架之后,我想看一下,使用异步日志能不能进一步提高性能表现。
AsyncAppender 和 Asynchronous Loggers
官方文档也指出:
在这种多线程应用的实践中需要主要:阻塞队列很容易发生锁争用,测试表明当大量线程并发写日志的时候,性能甚至会变得更糟糕。所以应该考虑使用无锁的Asyn Loggers进行优化。
上述的Asyn Loggers
是log42
团队后来才加入的异步实现,连官方文档都推荐它了,那还有什么好犹豫的呢。它需要引入一个额外的依赖:
<dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.2</version> </dependency>
Disruptor
通过CAS而不是锁实现多生产者、多消费者对RingBuffer的并发访问,实现高吞吐和高性能。
全异步和混合异步
Log4j2的异步日志的使用又可以分为全异步和混合异步,所谓全异步就是所有的日志都以异步方式输出;混合异步就是只有指定的代码文件用异步方式输出,其他日志使用同步方式输出;前者能够获得更高的性能,也是官方推荐的方式,后者具有更好的灵活性,可以进行针对性配置。
本文中我们直接使用全异步日志。
在springboot中开启全异步的方式很简单,只需要在配置文件中加如下配置(yml):
log4j2: contextSelector: org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
或者在用java -jar
启动的时候加入系统参数:
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
springboot 中多环境日志配置
在springboot中我们通常针对dev,test,live等多种环境会有多套配置文件,比如application-dev.yml
,application-test.yml
, application-live.yml
。然后可以在启动的时候可以通过在全局配置文件application.yml
指定某个配置文件来启用配置:
sping: profiles: active: live
日志同样有这样的需求,不同环境使用不同的日志配置,比如dev或test环境需要开启的log level为DEBUG
,而在live环境中却不需要。这种时候我们只需要写多套日志配置,比如log4j2-dev.yml
,log4j2-test.yml
,log4j2-live.yml
,然后在其对应的配置文件中启用日志配置就可以了:
logging: config: classpath:log4j2-dev.yml