同步日志与异步日志
同步日志打印模型的缺点是将日志写入磁盘的操作是由业务线程同步调用完成的;当业务线程把要打印的日志放入一个队列后直接返回,然后用一个线程专门负责从队列中取出日志任务并写入磁盘时,就成为了异步日志。
logback的核心实现
以下描述异步日志logback的实现。
logback的类图结构如下:
其中主要的功能在AsyncAppenderBase
中实现。
该类的一些成员变量:
AppenderAttachableImpl<E> aai = new AppenderAttachableImpl<E>(); //一个appender的装饰器,里面存放同步日志的appender,worker线程里使用的就是这个appender
BlockingQueue<E> blockingQueue; 在start方法初始化为一个ArrayBlockingQueue
public static final int DEFAULT_QUEUE_SIZE = 256; //默认队列大小
int queueSize = DEFAULT_QUEUE_SIZE;
int appenderCount = 0; //记录aai里面附加的同步appender的个数
static final int UNDEFINED = -1;
int discardingThreshold = UNDEFINED; //开始丢弃某些级别日志的队列大小阈值
boolean neverBlock = false; //日志队列满时是否阻塞
Worker worker = new Worker(); //日志的消费者
/**
* The default maximum queue flush time allowed during appender stop. If the
* worker takes longer than this time it will exit, discarding any remaining
* items in the queue
*/
public static final int DEFAULT_MAX_FLUSH_TIME = 1000;
int maxFlushTime = DEFAULT_MAX_FLUSH_TIME;
在解析完AsyncAppenderBase
的xml配置文件后将调用AsyncAppenderBase
的start
方法:
@Override
public void start() {
if