log4j 系列10 -- Log4j2 中的 同步日志 与 异步日志

https://www.cnblogs.com/yeyang/p/7944906.html
https://www.cnblogs.com/yangfeiORfeiyang/p/9775863.html
https://blog.csdn.net/henrydlwang/article/details/78939031
https://www.jianshu.com/p/9f0c67facbe2

Log4j 2中记录日志的方式有同步日志和异步日志两种方式,
其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式。

1、Log4j2中的同步日志

所谓同步日志,即当输出日志时,必须等待日志输出语句执行完毕后,才能执行后面的业务逻辑语句。

即:只有一个线程 同时处理 业务逻辑 和 日志逻辑

2、Log4j2中的异步日志

使用异步日志进行输出时,日志输出 与 业务逻辑 并不是在同一个线程中运行,而是有专门的线程用于进行日志输出操作,处理业务逻辑的主线程不用等待即可执行后续业务逻辑。

Log4j2中的异步日志实现方式有AsyncAppender和AsyncLogger两种。

  • AsyncAppender采用了ArrayBlockingQueue来保存需要异步输出的日志事件;
  • AsyncLogger则使用了Disruptor框架来实现高吞吐。

(1)、每个Async Appender,内部维护了一个ArrayBlockingQueue,将创建一个线程用于输出日志事件 【线程一一对应】

(2)、Disruptor简介 

Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,基于Disruptor开发的系统单线程能支撑每秒600万订单。
目前,包括Apache Strom、Log4j2在内的很多知名项目都应用了Disruptor来获取高性能。
Disruptor框架内部核心数据结构为RingBuffer,其为无锁环形队列。

并不是每个AsyncLogger对应着一个处理线程,而是仅仅有一个EventProcessor线程进行日志的异步处理。 【只多了一个线程】

3、实际应用中的3中配置方式

(1)全异步   jvm启动的时候增加一个参数 (AsyncAppender和AsyncLogger 同时使用)

(2)混合异步   Logger  既有同步也有异步

(3)全同步  ---默认就是吧(网上没搜到答案,估计应该是这样)

4、同步异步使用注意事项

  • 1、混合异步和同步Logger;root logger 为同步,其它为异步;
  • 2、AsyncLogger 的additivity属性设置为false;
  • 3、不要同时使用AsyncAppender和AsyncLogger,也就是在配置中不要在配置Appender的时候,使用Async标识的同时,又配置AsyncLogger,这不会报错,但是对于性能提升没有任何好处。
  • 4、不管是同步异步,都设置 immediateFlush为false,这会对性能提升有很大帮助。
  • 5、如果不是确实需要,不要打印location信息,比如HTML的location,或者pattern模式里的%C or $class, %F or %file, %l or %location, %L or %line, %M or %method, 等,因为Log4j需要在打印日志的时候做一次栈的快照才能获取这些信息,这对于性能来说是个极大的损耗。

观察官网给出的性能测试数据:

log4j 系列10 -- Log4j2 中的 同步日志 与 异步日志_第1张图片

log4j 系列10 -- Log4j2 中的 同步日志 与 异步日志_第2张图片

综合使用注意事项,可得出结论(推荐使用方式):【变 Logger ,Appender 保持不动】

  • 1、混合异步和同步Logger;root logger 为同步,其它为异步;
  • 2、AsyncLogger 的additivity属性设置为false;

 

你可能感兴趣的:(JAVA,log4j)