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
的使用要点