首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

读logback源码系列稿子(四)——记录日志

2012-09-14 
读logback源码系列文章(四)——记录日志今天晚上本来想来写一下Logger怎么记录日志,以及Appender组件。不过9

读logback源码系列文章(四)——记录日志
今天晚上本来想来写一下Logger怎么记录日志,以及Appender组件。不过9点才从丈母娘家回来,又被几个兄弟喊去喝酒,结果回来晚了,所以时间就只够写一篇Logger类的源码分析了。Appender找时间再写

上篇博客介绍了LoggerContext怎么生成Logger,Logger是logback的核心类,也是所有日志框架的核心类。这篇博客详细介绍一下Logger的各字段和方法,重点介绍Logger类是怎样记录日志的

老规矩,首先看图:


Logger类实现了slf4j框架定义的Logger接口,然后这个类和LoggerContext是互相引用的(因为Logger需要依赖LoggerContext的TurboFilter等组件)。并且Logger实现了AppenderAttachable接口,它实现该接口的方式,是持有AppenderAttachableImpl类,然后委托该类来实现AppenderAttachable接口定义的方法,这里用到了代理模式,是一个比较精巧的设计

看到了Logger类的全景图,接下来我们逐一介绍Logger类中的各个字段,最后重点介绍Logger类是怎样记录日志的

首先看看Logger的字段


这个方法是用来创建子Logger的,并且会设置Logger的父子关系,也是在LoggerContext的getLogger()方法里调用的

接下来就重点介绍Logger组件怎么记录日志了,slf4j定义了Logger接口记录日志的方法是info()、warn()、debug()等,这些方法只是入口,logback是这样实现这些方法的
final private ReadWriteLock rwLock = new ReentrantReadWriteLock();  private final Lock r = rwLock.readLock();  private final Lock w = rwLock.writeLock();

总结来说,Logger类中定义的字段和方法,是出于以下目的:
1、持有LoggerContext,是为了使用TurboFilter来进行快速过滤
2、定义parent和childList,用于实现父子Logger的树形结构
3、定义createChildByName()、getChildByName()方法,是供LoggerContext创建Logger
4、定义level、effectiveLevelInt,是为了判定日志级别是否足够
5、最后,filterAndLog()、buildLoggingEventAndAppend()、callAppenders()、appendLoopOnAppenders()方法,是Logger类的核心方法,一步步地委托AppenderAttachableImpl类来实际记录日志

下一篇博客,准备介绍Appender组件怎么记录日志

热点排行