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

10 篇文章 0 订阅

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;

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在多线程环境下,日志可能会出现错乱的情况,因为多个线程可能会同时写入同一个日志文件。为了避免这种情况,可以在log4j2配置文件设置一个Appender的locking属性为true,这样在写入日志时会使用同步锁来保证线程安全。示例如下: ``` <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <File name="file" fileName="example.log"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> <locking>true</locking> </File> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="file" /> </Root> </Loggers> </Configuration> ``` 另外,建议使用异步日志记录器(AsyncLogger)来记录日志,这样可以减少对主线程的阻塞,提高应用程序的性能。可以在log4j2配置文件设置AsyncLogger的ringBufferSize属性来控制异步队列的大小。示例如下: ``` <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="console" target="SYSTEM_OUT"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> </Console> <Async name="async"> <AppenderRef ref="console" /> <blocking>false</blocking> <ringBufferSize>1024</ringBufferSize> </Async> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="async" /> </Root> </Loggers> </Configuration> ``` 以上配置,Async Appender使用了一个大小为1024的环形缓冲区来存储日志事件,如果缓冲区已满,将会丢失最早的事件。blocking属性设置为false表示当缓冲区已满时不会阻塞当前线程,而是直接将事件丢弃。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值