logback
2020-03-26 10:46:52 0 举报
logback源码分析
作者其他创作
大纲/内容
1
获取Filter过滤器执行结果,如果是DENY则放弃此次输出
3
ch.qos.logback.core.encoder.LayoutWrappingEncoder
获取Filter过滤器数组
ch.qos.logback.classic.spi.LoggingEvent
4
8
执行append(event)抽象方法。该抽象方法由具体的Appender实现类根据输出方式进行实现1. OutputStreamAppender(ConsoleAppender的父类)2. DBAppenderBase3. AbstractSocketAppender4. SMTPAppenderBase5. 等等等预定义了appender抽象方法,便于扩展。此处是用到策略模式
ch.qos.logback.classic.Logger
buildLoggingEventAndAppend1. 构建日志事件实例:LoggingEvent2. 调用appender
举例说明1:OutputStreamAppender的实现,以及如何输出
org.slf4j.MDCAdapter
Logger的实现原理
2
ch.qos.logback.core.AppenderBase/UnsynchronizedAppenderBase
getTurboFilterChainDecision_1会返回FilterReply枚举。用于判断是否进行后续的日志处理。DENY:跳过剩下的过滤器,直接丢弃日志NEUTRAL:往后继续执行其他过滤器ACCEPT:跳过剩下的过滤器,直接执行日志输出
outputStream.write(byteArray);使用了ReentrantLock锁
16
prepareForDeferredProcessing()为后续的输出做准备工作,主要完成三点操作:1. 格式化日志文本2. 获取执行的线程名3. 获取MDC中存储的数据
有加同步锁synchronized
10asTypedArray获取Appender数组
getFilterChainDecision获取Filter过滤器,并执行返回结果,如果返回DENY,则放弃当前日志输出
14asTypedArray
doLayout(event)实际需要输出的风格处理。实际的Layout有很多的子类,如HtmlLayout等,用户可定制化Layout
getMDCPropertyMap()获取MDC中存储的数据
appendLoopOnAppenders
ch.qos.logback.core.filter.Filter
ch.qos.logback.core.Layout
5
callAppenders(event)创建完LoggingEvent实例后,开始调用Appender
从append(event)开始
getTurboFilterChainDecision获取执行完所有TurboFilter返回的FilterReply枚举结果
实现了MDCAdapter接口
ch.qos.logback.classic.util.LogbackMDCAdapter
ch.qos.logback.classic.spi.TurboFilterList
0
6. 构建LoggingEvent实例
ch.qos.logback.core.spi.AppenderAttachableImpl<ILoggingEvent>
MDC的实现原理
ch.qos.logback.classic.turbo.TurboFilter
7
decide循环调用TurboFiler的decide方法,返回FilterReply,只要有一个TurboFilter返回DENY或ACCEPT,则跳出循环;如果是NEUTRAL,则继续循环执行下一个TurboFilter
getFormattedMessage格式化日志文本
此Turbo过滤器List实现了List接口。用于存储所有的TurboFilter
11doAppend(event)
13getFilterChainDecision((event)
ch.qos.logback.core.OutputStreamAppender
filterAndLog_1
12
15
实现了Appender接口的抽象类
6
encode(event)调用encode方法,获取输出字节码byte[]
ch.qos.logback.core.util.COWArrayList<Appender>
ch.qos.logback.core.util.COWArrayList<Filter>
java.io.OutputStream
ch.qos.logback.core.spi.FilterAttachableImpl<LoggingEvent>
循环调用Filter的decide方法,并返回FilterReply结果
9.appendLoopOnAppenders(event)
ch.qos.logback.classic.LoggerContext
getThreadName获取线程名
org.slf4j.MDC
循环调用decide
循环调用Appender的doAppend方法。
writeBytes(bytes)输出字节流
0 条评论
下一页
为你推荐
查看更多