springboot使用log4j2异步日志提升性能的实现方式

 更新时间:2022年05月06日 09:21:09   作者:字母哥哥  
这篇文章主要介绍了springboot使用log4j2异步日志提升性能,异步日志实现方式:将日志存入一个单独的队列中,有一个单独的线程从队列中获取日志并写入磁盘文件,需要的朋友可以参考下

同步日志的业务流程处理和日志打印是在同一个线程,日志打印的过程实际上是写文件IO的过程,这个过程是相对耗时的,并且会阻塞主线程的执行,只有日志打印完成后才会继续执行业务处理代码。如果日志量比较大,会影响主业务流程的处理效率。异步日志实现方式:将日志存入一个单独的队列中,有一个单独的线程从队列中获取日志并写入磁盘文件。

  • 日志放入队列的耗时,肯定比磁盘写IO文件耗时要少的多得多,所以对主业务流程影响极小。
  • 一个单独的线程进行日志写IO磁盘操作,所以不会阻塞主业务线程的执行。

一、引入disruptor

Log4j2基于LMAX公司开发Disruptor(一个开源的无锁并发框架),改善了Log4j和Logback在架构设计方面的缺陷,具有超高的吞吐量和低延迟。所以我们想获取log4j2异步日志带来的性能提升,要先引入disruptor 。

<!-- Needed for Async Logging with Log4j 2 -->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.6</version>
</dependency>

二、 全局异步模式

全局异步模式对日志的输出性能有非常大的提升,是官方推荐的异步日志输出方式。可以有两种方式为Spring Boot应用配置异步日志,第一种就是在应用启动类里面使用System.setProperty,代码如下:

@SpringBootApplication
public class BootLaunchApplication {
   public static void main(String[] args) {
      //下面语句使得Log4j2日志输出使用异步处理,减小输出日志对性能的影响
      System.setProperty("Log4jContextSelector",
                  "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
      SpringApplication.run(BootLaunchApplication.class, args);
   }
}

第二种是通过启动参数来设置全局异步日志

java -jar -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector boot-launch-1.0.jar

在以上配置完成之后,我们可以在log日志打印的位置下断点。当我们看到下图中红色边框部分的Log4j2-TF-1-AsyncLogger线程的时候,说明我们的全局异步日志配置成功了。

三、异步/同步混合模式

除了全局异步模式,slf4j还支持异步/同步混合模式。全局异步模式虽然是性能最好的日志输出方式,但是也是耗费主机资源最多的方式,如果你的应用服务器性能一般,你又想获得较好的日志输出性能,可以采用如下的方法。

采用异步/同步混合模式就不需要配置第二小节中的Log4jContextSelector

在log4j2 xml里面对Loggers配置进行改造,加入AsyncLogger也就是异步日志,只针对com.zimug.boot.launch包(假如已知这个包对处理性能要求比较高)下的代码产生的日志采用异步模式,其他的日志仍然使用同步模式。

<Loggers>
        <!-- 针对com.zimug.boot.launch包下面的日志采用异步日志 -->
        <AsyncLogger name="com.zimug.boot.launch" level="debug" additivity="false">
            <AppenderRef ref="CONSOLE" level="debug"/>
            <AppenderRef ref="FILE-APPENDER" level="info"/>
        </AsyncLogger>

        <!-- 系统默认日志设置 -->
        <Root level="debug">
            <AppenderRef ref="CONSOLE" level="debug"/>
            <AppenderRef ref="FILE-APPENDER" level="info"/>
        </Root>
</Loggers>

到此这篇关于springboot使用log4j2异步日志提升性能的文章就介绍到这了,更多相关springboot log4j2异步日志内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot跨域CORS处理代码解析

    springboot跨域CORS处理代码解析

    这篇文章主要介绍了springboot跨域CORS处理代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java使用策略模式实现聚石塔接口调用的问题

    Java使用策略模式实现聚石塔接口调用的问题

    这篇文章主要介绍了Java使用策略模式实现聚石塔接口调用,为了避免多重判断,而且有更好的扩展性,首选了策略模式来实现,具体解决方法跟随小编一起看看吧
    2021-12-12
  • Spring定时任务注解@Scheduled详解

    Spring定时任务注解@Scheduled详解

    这篇文章主要介绍了Spring定时任务注解@Scheduled详解,@Scheduled注解是包org.springframework.scheduling.annotation中的一个注解,主要是用来开启定时任务,本文提供了部分实现代码与思路,需要的朋友可以参考下
    2023-09-09
  • Java Socket+mysql实现简易文件上传器的代码

    Java Socket+mysql实现简易文件上传器的代码

    最近在做一个小项目,项目主要需求是实现一个文件上传器,通过客户端的登陆,把本地文件上传到服务器的数据库(本地的)。下面通过本文给大家分享下实现代码,感兴趣的朋友一起看看吧
    2016-10-10
  • SpringBoot之@Aspect注解解读

    SpringBoot之@Aspect注解解读

    这篇文章主要介绍了SpringBoot之@Aspect注解解读,AOP是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,而@Aspect 就是把一个类定义为切面供容器读取,需要的朋友可以参考下
    2024-01-01
  • java基于UDP实现图片群发功能

    java基于UDP实现图片群发功能

    这篇文章主要为大家详细介绍了java基于UDP实现图片群发功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Java中HashTable和HashMap的区别_动力节点Java学院整理

    Java中HashTable和HashMap的区别_动力节点Java学院整理

    HashTable和HashMap主要的区别有:线程安全性,同步(synchronization),以及速度。接下来通过本文给大家简单介绍下HashTable和HashMap的区别,需要的的朋友参考下吧
    2017-04-04
  • Springboot Cucumber测试配置介绍详解

    Springboot Cucumber测试配置介绍详解

    这篇文章主要介绍了Springboot Cucumber测试配置介绍详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • IDEA 单元测试创建方法详解(2020.03版本亲测)

    IDEA 单元测试创建方法详解(2020.03版本亲测)

    这篇文章主要介绍了IDEA 单元测试创建方法详解(2020.03版本亲测),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot权限认证-Sa-Token的使用详解

    SpringBoot权限认证-Sa-Token的使用详解

    Sa-Token是一款轻量级Java权限认证框架,它简化了权限管理,提高了开发效率,本文通过实例介绍了Sa-Token的基本概念、与其他框架的比较、基本语法和高级用法,并探讨了其核心原理和实际应用场景,感兴趣的朋友一起看看吧
    2024-09-09

最新评论