为啥
每天学习每天进步,还有慧姐一起学习,能不快乐嘛
logback 的架构图
由图可知 是基于appender来实现的各种日志打印功能,主要包含file ,async,console,db呀,具体可以看一下谁继承了Appender 接口
LoggingEvent 日志的封装类
AsyncAppender介绍
看一下为啥异步打印会有日志丢失,及日志阻塞的问题,
AsyncAppender extends AsyncAppenderBase
首先: AsyncAppender继承自AsyncAppenderBase,主要功能就是这个了,
我们可以看一下里面的结构
BlockingQueue
AsyncAppenderBase
看上面的两个结构,大家都差不多能猜出来了,没错就是打印日志 先加入到BlockingQueue ,使用queue.put()然后 起一个work,一直去queue里面阻塞式 queue.take(),这样就完成了异步处理,
work 里面有一个appendLoopOnAppenders 方法,里面是执行了多个Appender 的doAppender 方法, AsyncAppender 的功能已经在上面work 实现了,
1. 就调用了UnsynchronizedAppenderBase 里面实现了 doAppend 方法来打印日志: 里面有个ThreadLocal
因为work 只有一个,所以这个类里面的内容就是搞成了私有变量,
- 然后调用具体的真实打日志的Appender了
问题分析
-
为啥日志丢失
阻塞队列默认设置为256 this.blockingQueue = new ArrayBlockingQueue(this.queueSize);使用offer 方法在队列满的时候,就直接丢掉了, -
日志重复:待定
发表回复