log4j2日志性能分析

Log4j2两大优点:异步日志和无垃圾记录

一、异步日志

Log4j2如何实现异步日志?

全局异步

混合异步

二、无垃圾记录

一、异步日志

正常日志流程(同步日志):logger.info(“”)->全局filter进行level过滤->Logger自身level过滤->生成日志输出内容->生成LogEvent(日志事件对象,来配置一系列信息)->Logger配置的filter进行level过滤->Appender配置的filter进行level过滤->是否拦截还是放行->PatternLayout格式化LogEvent->OutputStream输出到app.log

随着日志信息记录的越来越多,性能会出现问题

异步日志:logger.info->创建Logger对象->生成LogEvent事件(并不会调用Appender进行日志的具体处理,而是把它传给了BlockingQ阻塞队列)
主线程的任务完成了,继续去处理业务代码,这表示下面的代码不会去立马执行,等待时间就大大缩短了,也就间接提高了程序运行性能问题
超过阻塞队列以后,log4j2开启新的线程,通过新的线程来具体执行LogEvent对象,调用具体的Appender进行处理,输出到指定位置,控制台或者日志文件当中
异步日志执行流程,内部也需要执行上面的这些流程,但是主线程不需要去等待

Log4j2如何实现异步日志?
配置异步日志需要的依赖
在这里插入图片描述

1、通过异步Appender(性能提升并不大,很少使用)
2、通过异步Logger(分成全局异步和混合异步)
全局异步:所有的日志都异步的记录,在配置文件上不用做任何改动,只需要添加一个logger4j2.component.properties配置
在这里插入图片描述

混合异步(也可以称为局部异步日志):可以在应用中同时使用同步日志和异步日志,使得日志的配置方式更加灵活
在这里插入图片描述

使用异步日志需要注意的问题:
1、如果使用异步日志,AsyncAppender、AsyncLogger和全局日志,不要同时出现。性能会和AsyncAppender一致,降至最低。(木桶原理:最短板)
2、 设置includeLocation:false,关闭行号位置信息,打印位置信息会急剧降低异步日志性能,比同步日志还要慢

二、无垃圾记录

垃圾收集暂停是延迟峰值的常见原因,并且对于许多系统而言,花费大量精力来控制这些暂停。
许多日志库(包括以前版本的logj)在稳态日志记录期间分配临时对象,如日志时间对象,字符串,字符串数组,字节数组等,这些对垃圾收集器造成压力并增加GC暂停发生的频率

Log4j2 2.6版本开始,默认情况下log4j2以“无垃圾”模式运行,其中重用对象和缓冲区,并且尽可能不分配临时对象。还有一个“低垃圾”模式,它不是完全无垃圾,但不使用ThreadLocal字段。
无垃圾日志记录部分通过重用ThreadLocal字段中的对象来实现,部分通过将文本转换为字节时重用缓冲区来实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值