读log4j源码一点体会 | |
| |
一.前言 | |
大家都知道 log4j 是 apache 软件组织的 open source 的很实用的日志工具,广泛的应用在我们的项目中,本人这几天利用业余时间细细体味了一下其源码,竟用意想不到的收获,在这里给大家一起分享一下. | |
二.分析 | |
![]() | |
从上图中我们可以很清楚的了解到这四个抽象体之间的关系,Logger是我们使用log4j的接口, 比如我们常在程序中这样定义Logger ,Logger myLogger = Logger.getLogger(MyClass.class); 最有意思的是 LoggingEvent,它就如整个系统的一根主线,其它三个抽象体的工作运行都是围绕着这根主线发生着互动,我们平时如调用 myLogger.debug("..."); 就会先由 Logger 产生一个LoggingEvent将其转交给相应的 Appender,Appender 在将信息输出前会调用相应的 Layout 对信息进行格式化,最将信息输出到最后的目的地。 | |
这里我要提到的是一个很特别的地方,Logger在log4j内部存在一个父子的层次关系,也就是说每个Logger对象中有一个parent属性指向其父Logger,顶级rootLogger的parent就为null,log4j这样定义Logger的层次关系: 系统初始化时会产生一个 root Logger,所以以后在程序中调用 Logger.getLogger(..)方法得到的Logger都是间接或直接成为root Logger 的子Logger,比如说,在 com.mypackage.MyClass 中,调用 Logger myLogger = Logger.getLogger(MyClass.class) 产生一个Logger对象,如果 存在一个 com.mypackage 名字的Logger,那么这个Logger 将成为 myLogger 的父Logger,如果不存在,log4j会找 名字为 com的,不果不存在,root Logger 将成为其父Logger,当产生日志事件, 简单的讲就是在程序中调用 myLogger.debug("...") 或其它级别的方法时,log4j会向上一级级的访问 myLogger及myLogger的父Logger, log4j为什么要这样设计,这样做不是很麻烦吗,这是初看log4j源码很容易迷惑的地方,同时也是log4j一个很有特色的地方, 首先大家一定知道Java的一个编程思想,就是最大限度的代码重用,这里我们再上升一个层次看这个问题,它这样设计可以做到资源重用,因为我们可以看到Appender这个系统抽象体实际代表着一种日志输出用流资源, 只有通过它我们才可以把我们自己的日志信息写到我们想要的地方,如果每生一个Logger对象都要跟其配一些Appender,这不就很浪费,而且会影响性能,所以这种设计就可以有效的重用这些Appender资源,同时log4j也允许你通过配置文件配置自己相应Logger的Appender。 | |
读log4j源码一点体会(转移)
最新推荐文章于 2020-04-04 21:47:27 发布