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需要在打印日志的时候做一次栈的快照才能获取这些信息,这对于性能来说是个极大的损耗。
观察官网给出的性能测试数据:
综合使用注意事项,可得出结论(推荐使用方式):【变 Logger ,Appender 保持不动】
- 1、混合异步和同步Logger;root logger 为同步,其它为异步;
- 2、AsyncLogger 的additivity属性设置为false;