1.对appender-ref 的认识。
2.线程同步的认识。
2.1 logger.info从全局里匹配到对应的appender(单例)
2.2 执行appender的doAppend
2.3 由于是继承模式来扩展功能。方法会被覆载并且添加新的功能。{ 导致底层的类的功能的代码阅读特别难阅读,代码跳来跳去。例如RollingFileAppender,覆载了父类FileAppender的subAppend,增加了文件变更的功能。 而FileAppender },调用子类实现的
abstract protected void append(E eventObject);
2.4 继续调用 某个子类的扩展 protected void subAppend(E event) {}
如果是RollingFileAppender,又会被
1.看到AsynAppender里配置了appender-ref,有点好奇这个的功能。
想探索原因。1. 对比了RollingFileAppender 和AsyncAppender整体父类结构,了解接口和类的概念。
2.貌似没有ref相关的字段。
新的思路:全局搜索appender-ref ,想找到解析的入口。
最终找到:
JoranConfigurator.java
rs.addRule(new ElementSelector("configuration/logger/appender-ref"),
new AppenderRefAction());
rs.addRule(new ElementSelector("configuration/root/appender-ref"),
rs.addRule(new ElementSelector("configuration/appender/appender-ref"),
new AppenderRefAction());
通过全局搜索找到对应的执行类。
说明只有异步的asyncAppenderBase才有依赖的appender。
通过
worker.start(); 一个线程+一个队列。来执行append
E e = parent.blockingQueue.take();
aai.appendLoopOnAppenders(e); //即封装了真正appender的类。内部就是一个list封装。
aai
public class AppenderAttachableImpl<E> implements AppenderAttachable<E> {
final private CopyOnWriteArrayList<Appender<E>> appenderList = new CopyOnWriteArrayList<Appender<E>>();}
研究代码AsyncAppenderBase.java发现,该版本logback不支持neverBlock参数.当discardingThreshold配置为0的时候,一旦异步队列填满,会被阻塞. 1.1.2.jar是有问题的.