java log4j 异步_Log4j的异步日志

本文详细解析了log4j的AsyncAppender如何实现日志的异步输出,采用生产者消费者模型,通过Buffer和DiscardSummary进行中转。当Logging Event超过Buffer容量时,会被放入DiscardSummary,由Dispatcher线程负责从Buffer中取出并分发到对应的appender进行日志推送。AsyncAppender的关键在于append方法和Dispatcher类,确保在大量日志事件时能有效处理。
摘要由CSDN通过智能技术生成

先引用一些网络上的异步日志介绍log4j日志异步化大幅提升系统性能 - 穿林度水 - 博客园​www.cnblogs.com

org.apache.log4j.AsyncAppender就是实现异步日志输入的Appender

我们知道,一个日志输出行为,牵涉到logger,appender,logevent,其中一个系统可能包含多个logger,当指定一个logger时,这个logger也可能包含多个appender,一个日志内容被封装成一个logevent来传递;

org.apache.log4j.Category类是logger类的父类

public

void error(Object message, Throwable t) {

if(repository.isDisabled(Level.ERROR_INT))

return;

if(Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel()))

forcedLog(FQCN, Level.ERROR, message, t);

}

最终都会调用的每个Appender的append方法;

异步输出日志工作原理

AsyncAppender采用的是生产者消费者的模型进行异步地将Logging Event送到对应的Appender中。

a、 生产者:外部应用了Log4j的系统的实时线程,实时将Logging Event传送进AsyncAppender里

b、 中转:Buffer和DiscardSummary

c、 消费者:Dispatcher线程和appenders

工作原理:

1) Logging Event进入AsyncAppender,AsyncAppender会调用append方法,在append方法中会去把logging Event填入Buffer中,当消费能力不如生产能力时,AsyncAppender会把超出Buffer容量的Logging Event放到DiscardSummary中,作为消费速度一旦跟不上生成速度,中转buffer的溢出处理的一种方案。

2) AsyncAppender有个线程类Dispatcher,它是一个简单的线程类,实现了Runnable接口。它是AsyncAppender的后台线程。

Dispatcher所要做的工作是:

① 锁定Buffer,让其他要对Buffer进行操作的线程阻塞。

② 看Buffer的容量是否满了,如果满了就将Buffer中的Logging Event全部取出,并清空Buffer和DiscardSummary;如果没满则等待Buffer填满Logging Event,然后notify Disaptcher线程。

③ 将取出的所有Logging Event交给对应appender进行后面的日志信息推送。

以上是AsyncAppender类的两个关键点:append方法和Dispatcher类,通过这两个关键点实现了异步推送日志信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值