logback之Appender源码解读

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了logback之Appender源码解读相关的知识,希望对你有一定的参考价值。

参考技术A

在logback日志框架中,每一个Logger都会去关联一个Appender,Appender是真正把日志内容输出到控制台,文件等,可以说在日常应用中非常重要和拓展的一个组件。

其中最重要的就是 doAppend() 方法,每一个日志事件输出,都会调用到这个接口。

其中,有我们熟悉的 ConsoleAppender 和 FileAppender ,还有 RollingFileAppender 。另外,有一个很重要的 AsyncAppender 接口,异步输出,这也是logback日志受欢迎的一个非常重要的特性。他们都继承与抽象类 UnsynchronizedAppenderBase 类。

在 UnsynchronizedAppenderBase 中,我们看一下其中实现了最重要的一个方法 doAppend()

其实这个方法没有东西也没有做,只是使用模版方法,让具体的子类交给子类的 append() 方法实现具体的逻辑。

在 OutputStreamAppender 类中,有几个比较重要的成员变量。

其中 encoder 最主要的作用就是把日志事件要输出的内容变成字节数组,然后把字节数组写入到 outputStream 。

其中 outputStream 可以是控制台或者文件等。

接着看 append() 方法

这个方法也是没有做什么,接着具体看 subAppend() 方法。

在这个方法中,可以看到 encoder 的作用,同时还有一个重要的方法 writeBytes()

这个方法就是把字节数组写入到outputStream中。

总结一下:一个日志事件记录的流程就是,要需要输出的内容通过encoder变成字节数组,然后写入到具体的输出流中。

ConsoleAppender 继承了 OutputStreamAppender ,唯一不一样的就是输出的位置, ConsoleAppender 是输出到控制台,outputStream输出流也应该是控制台。

其中, start() 方法会在初始化logback.xml配置的时候去调用,在 start() 方法中就设置了outputStream输出流——控制台。

FileAppender ,如果一个日志事件需要输出到文件中,那么它就需要一个文件输出流FileOutStream。

需要设置一个文件名。在看看 start() 方法对 FileAppender 进行初始化工作。

主要看 openFile() 方法

在这个方法中,通过文件名去 new File() 文件,然后封装到 ResilientFileOutputStream 中,然后设置 setOutputStream() ,这样子就可以把日志输出到文件中了。

异步输出,也就意味着会把日志事件先放入到一个队列中,然后由专门的线程去队列中拿日志事件消费。

看类 AsyncAppenderBase 中几个重要的成员变量

AppenderAttachableImpl 里面包含一个Appender列表,列表是具体的Appender,如上面讲到的ConsoleAppender和FileAppender。

BlockingQueue是一个队列,Worker是一个消费线程。

例如,在配置文件中定义一个异步的Appender

接下来看看具体是如何实现异步输出的。

start() 方法初始化中,定义了一个 ArrayBlockingQueue 队列,以及启动了一个worker线程。

接着看 append() 方法

在 append() 方法中,并没有马上处理日志事件,而是调用 put() 方法

接着把日志事件放进去消息队列中。然后由 Worker 线程去处理

Worker 线程从队列中take()取出事件,然后由具体的Appender去处理

看到调用 doAppend() ,已经和之前的Appender是一样的啦。
本文是笔者个人的理解,若有不正确指出请多多纠正。

以上是关于logback之Appender源码解读的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearchEs 源码之 AsyncSearchMaintenanceService 源码解读

ElasticSearchEs 源码之 CacheService 源码解读

ElasticSearchEs 源码之 CcrRestoreSourceService 源码解读

ElasticSearchEs 源码之 CleanerService 源码解读

ElasticSearchEs 源码之 Exporters 源码解读

ElasticSearchEs 源码之 AutoFollowCoordinator 源码解读