logback 异步打印解析

为啥

每天学习每天进步,还有慧姐一起学习,能不快乐嘛

logback 的架构图

由图可知 是基于appender来实现的各种日志打印功能,主要包含file ,async,console,db呀,具体可以看一下谁继承了Appender 接口
LoggingEvent 日志的封装类

AsyncAppender介绍

看一下为啥异步打印会有日志丢失,及日志阻塞的问题,

AsyncAppender extends AsyncAppenderBase

首先: AsyncAppender继承自AsyncAppenderBase,主要功能就是这个了,
我们可以看一下里面的结构
BlockingQueue blockingQueue;
AsyncAppenderBase.Worker worker = new AsyncAppenderBase.Worker();

看上面的两个结构,大家都差不多能猜出来了,没错就是打印日志 先加入到BlockingQueue ,使用queue.put()然后 起一个work,一直去queue里面阻塞式 queue.take(),这样就完成了异步处理,

work 里面有一个appendLoopOnAppenders 方法,里面是执行了多个Appender 的doAppender 方法, AsyncAppender 的功能已经在上面work 实现了,
1. 就调用了UnsynchronizedAppenderBase 里面实现了 doAppend 方法来打印日志: 里面有个ThreadLocal

因为work 只有一个,所以这个类里面的内容就是搞成了私有变量,

  1. 然后调用具体的真实打日志的Appender了

问题分析

  1. 为啥日志丢失
    阻塞队列默认设置为256 this.blockingQueue = new ArrayBlockingQueue(this.queueSize);使用offer 方法在队列满的时候,就直接丢掉了,

  2. 日志重复:待定


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注