Log4J 原理以及配置的研究

 

在进行 Log4J 的使用过程中,我对下面的两个问题比较敏感:

 

1、  Log4J 是如何进行工作的?

这是在 Log4J 项目中对 Log4J 的介绍中的一段话

With log4j it is possible to enable logging at runtime without modifying the application binary. The log4j package is designed so that these statements can remain in shipped code without incurring a heavy performance cost. Logging behavior can be controlled by editing a configuration file, without touching the application binary.

 

对于 Log4J 的具体如何进行工作的原理,在 javaeye buaawhl 给出了一个解释:

http://buaawhl.javaeye.com/blog/6450

总结一下就是利用 JDK 提供的 new Throwable().getStackTrace() 方法返回当前运行栈的结构层次,然后对返回的调用栈的信息进行分析,找到调用该类的类的名称。(也就是Log4J自己说的Runtime期间实现Log)

 

由于在 Log4J 只存在一个根 Logger ,并且 Logger 之间存在继承的关系,并且我们可以在配置文件( log4J.proerties 或者 XML )中进行配置,可以初始化指定的 Logger ,并且对指定的 Logger 进行一些相关的配置,如设置如何进行输出,以及如何将输出进行布局。并且由于 Logger 之间会存在继承的关系(会找一个最近的 Logger 进行继承,如果没有就以根 Logger 作为父类,共享父类的配置信息),以及父子类之间初始化没有先后的顺序,所以我们可以在配置文件中,对各个程序以及不同的包中使用到 Log4j Log 纪录方式进行配置。

 

如果在同一个 APPLICATION 对相同名称的 Logger 进行调用,那么只会返回一个 Logger 实例。

2、  Log4J 会不会对系统的性能造成大的影响?

 

这是对 Log4J 性能的一些描述,看来还是不错的,呵呵,在调整一下 Log 的等级就可以了。

On an AMD Duron clocked at 800Mhz running JDK 1.3.1, it costs about 5 nanoseconds to determine if a logging statement should be logged or not. Actual logging is also quite fast, ranging from 21 microseconds using the SimpleLayout, 37 microseconds using the TTCCLayout. The performance of the PatternLayout is almost as good as the dedicated layouts, except that it is much more flexible.

注:对于 Common Logging Log4J 的关系可以参见 (其实 JCL 是一个规范,对一些 Log 工具进行了包装,我们常会使用到的具体实现还是 Log4j ,当然也可以使用其他的实现)

http://hedong.3322.org/archives/000316.html

参考资料:

http://www-128.ibm.com/developerworks/cn/java/l-log4j/index.html 使用 Log4J 进行日志操作

http://zooo.51.net/heavyz_cs/notebook/log4j.html Log4J 学习笔记(推荐)

http://www.dingl.com/view.shtml?xh=485 log4j 配置

http://hedong.3322.org/archives/000193.html 竹笋炒肉的 Log4J 学习笔记

http://forum.springside.org.cn/redirect.php?fid=3&tid=382&goto=nextoldset SpringSide Log4j 的使用要点