JR 精品文章 - log4j3分钟入门
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » 第三方类库 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
log4j3分钟入门
nepalon 原创   更新:2003-12-20 08:18:28  版本: 1.0   

我们在编程时经常不可避免地要使用到一些日志操作,比如开发阶段的调试信息、运行时的日志记录及审计。调查显示,日志代码占代码总量的4%。通常大家可以简单地使用System.out.println()语句输出日志信息,但是在发布时,通常不想在正式的版本中打印这些开发时的调试信息,于是又要手工地把这些语句删除,所以大量的这样的System.out.println()调试语句会带来麻烦。更多做法是把它封闭一个简单的输出,比如:
  1. public final class Debug 
  2. {
  3.     public static final boolean debugOn = true;
  4.     public static void println(String msg) {
  5.         if (debugOn) 
  6.         {
  7.             System.out.println(msg);
  8.         }
  9.     }
  10. }

这样就可把代码中要用System.out.println()输出调试信息的地方全用Debug.println()替代,当在发布时只需把Debug类中的debugOn改成false即可。这样做虽然在一定程度上解决了问题,但如果需要的是更复杂的日志系统呢,比如把日志信息保存为文件等别的形式;又或是当系统在试运行了一段时间后我们又要更改某些试运行时的测试信息。如果真的遇到这样的情况,也行就只有修改代码了,这样又给开发工作带来了麻烦。

Log4J是Apache软件基金会Jakarta项目下的一个子项目,是用Java编写的优秀日志工具包。通过Log4J可以在不修改代码的情况下,方便、灵活地控制任意粒度的日志信息的开启或关闭,然后使用定制的格式,把日志信息输出到一个或多个需要的地方。并且,Log4J还有一条平滑的学习曲线,在三分钟内就可学会它的简单使用。随着使用深入,你会发现Log4J功能的强大,几乎可以满足日志方面的所有需要。

第一个log4j程序及其原理


1 第一个log4j程序


让我们从现在开始记时,看完成第一个log4j程序要不要3分钟。首先log4j-1.2.7.jar考到你的类路径下。然后创建一个类,代码如下:
  1. package TestLog4j;
  2. import org.apache.log4j.Logger;
  3. import org.apache.log4j.BasicConfigurator;
  4. import org.apache.log4j.PropertyConfigurator;
  5. import org.apache.log4j.Priority;;
  6. public class TestLog4j 
  7. {
  8.     //代码(1)
  9.     static Logger logger = Logger.getLogger(TestLog4j.class.getName());
  10.     public TestLog4j(){}
  11.     public static void main(String[] args)
  12. {
  13.      //代码(2)
  14.         BasicConfigurator.configure();
  15.          //代码(3)
  16.         logger.debug("Start of the main() in TestLog4j");
  17.         logger.info("Just testing a log message with priority set to INFO");
  18.         logger.warn("Just testing a log message with priority set to WARN");
  19.         logger.error("Just testing a log message with priority set to ERROR");
  20.         logger.fatal("Just testing a log message with priority set to FATAL");
  21.         logger.log(Priority.DEBUG, "Testing a log message use a alternate form");
  22.         logger.debug("End of the main() in TestLog4j");
  23.     }
  24. }

最后运行这个类,你就会看到运行结果为:
0 [main] DEBUG TestLog4j.TestLog4j  - Start of the main() in TestLog4j
10 [main] INFO TestLog4j.TestLog4j  - Just testing a log message with priority set to INFO
10 [main] WARN TestLog4j.TestLog4j  - Just testing a log message with priority set to WARN
21 [main] ERROR TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR
21 [main] FATAL TestLog4j.TestLog4j  - Just testing a log message with priority set to FATAL
111 [main] DEBUG TestLog4j.TestLog4j  - Testing a log message use a alternate form
111 [main] DEBUG TestLog4j.TestLog4j  - End of the main() in TestLog4j
好了,看一看你的表,应该不到3分钟吧。在这短短的3分钟里,我们做了些什么呢?下面我们来分析一下代码。
1)    首先代码(1)先通过Logger类的getLogger()方法得到一个Logger类的对象。在getLogger()方法中,通常把所在的类的Class对象或是所在类的全名作为参数。运用log4j输出日志要用到Logger对象。
2)    然后代码(2)进行一些必要的初始化,如要把调试信息输出到哪。当用System.out.println()时可以很明确的知道要把信息输出到标准输出设备且只能输出到那里。运用log4j,我们可以输出到许多地方,如控制台、文件、HTML文件等,至于要输出到哪里,就要自己进行初始化。在代码(2),我们调用自带的初始化方法来完成初始化。用这个方法进行初始化就不能体现出log4j的灵活性,所以基本上不会这样做。Log4j提供了用XML文件或Java配置文件来配置设置的方法,在下面我们将进行介绍。
3)    接着代码(3)就是输出信息的代码了。你可以看到代码(3)中尝试了用几种不同的方法来输出信息,对于这几种信息的作用,我会在下面进行介绍,你现在只需把它当成是输出语句就行。
最后,我们来看一下运行结果(日志信息)的意义。第一个数字是指程序开始运行到运行该日志语句所经历的毫秒数(用来做一点运行效率分析也不错),“[main]”是日志事件发生的线程,随后的“DEBUG”、“INFO”等信息是相应日志信息的优先级别,“TestLog4j.TestLog4”是当前TestLog4所在的包和名称,最后是日志信息。

2 实例原理


虽然完成了第一程序了,但程序中的内容还是不太了解。好,现在我就对上面的例子用到的log4j的原理进行讲解。在以后的章节中,我都会采取这种先实例,再根据实例来介绍所涉及的log4j原理的方法。
2.1 记录器Logger

Logger类是在log4j1.2以后才有的,以前是用Category类来实现现在的Logger类的功能的。从API可知,Logger类是Category类的子类。Logger类的代码如下:
  1. package org.apache.log4j;
  2. public class Logger {
  3.     // 创建和取回方法:
  4.     public static Logger getRootLogger();
  5. public static Logger getLogger(String name);
  6. public static Logger getLogger(Class class1);
  7.     // 打印方法:
  8.     public void debug(Object message);
  9.     public void info(Object message);
  10.     public void warn(Object message);
  11.     public void error(Object message);
  12.     public void fatal(Object message);
  13.     // 常用打印方法:
  14.     public void log(Level l, Object message);
  15. }

在讨论Logger类中的方法之前,我先讲一下log4j中的级别(level)的概念。
2.1.1 级别Level

Log4j中的日志级别分为五种:DEBUG、INFO、WARN、ERROR和FATAL,这五种级别从左到右级别依次增加。
2.1.2 Logger中的打印函数与级别

对于每一个记录器,我们都可对它赋于一定的级别,而打印函数打印的即是相应级别的信息。当对一个级别为A的Logger调用级别为B的打印方法时,只有当B>=A时才会进行打印。例如,如果有一个级别为WARN的Logger对象logger,只有对它调用logger.warn (message)、logger.error (message)和logger.fatal (message)这三个打印函数才会打印信息;而调用logger.debug (message)和logger.info (message)则不会打印信息,因为debug()函数只有当logger的级别为DEBUG时才打印信息,info()函数只有当logger的级别为INFO时才打印信息。
除了对应于每一个级别有一个打印函数外,在Logger类中还有一个log(),它可以让你通过参数来指定一个打印信息的打印级别。

引入级别后就可通过修改调试的级别来控制某个调试信息是否输出。假设我们有的信息是在开发时才需要输出的(称为测试信息),那么我们把输出测试信息的Logger的级别在开发时设为DEBUG级别的,并用debug(Object message)函数来进行打印。当要发布系统时,只需把相应的Logger的级别调高就可以屏蔽掉测试信息。





版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     25       3
作者其它文章: 作者全部文章
游客: 侠客007 发表时间: Sat Dec 20 08:27:56 CST 2003
举报!本文抄袭《开放系统世界》2002年第11期中的文章,不过是删减了其中的一些内容。请看:
http://developer.ccidnet.com/pub/disp/Article?columnID=294&articleID=30621&pageNO=1

可恶!其它文章也是垃圾,为了抢第一,真是不要脸。
评论人:keerbritney 发表时间: Mon Dec 22 19:41:32 CST 2003
我看不要脸的是你自己吧,随便说别人写的东西是垃圾,不懂得尊重别人,简直比垃圾还要可恶!;(
评论人:falltang 发表时间: Mon Dec 22 19:46:02 CST 2003
我有同感,我觉得别人写的东西不管好还是不好,都是自己的经验,把这种经验与大家分享难道不好吗?再说你也不能全盘否定别人的作品,更何况还有好几篇文章被csdn转载了呢。哈哈!
评论人:eugene 发表时间: Sat Dec 27 13:27:21 CST 2003
这篇文章的确像侠客007所说的那样,和那篇文章很相似。

作者不想解释一下吗?JR的管理员们也都没什么表示吗?
评论人:springouting 发表时间: Tue Dec 30 19:34:06 CST 2003
其实写写自己的心得更重要。
评论人:togetherj 发表时间: Wed Dec 31 11:41:35 CST 2003
什么性质无所谓,只要对读者有帮助就是好文章^_^,何况描述一样的技术必然有相似性。
评论人:david 发表时间: Wed Dec 31 20:21:18 CST 2003
有严重抄袭嫌疑,本文的赞成票数目也突然大幅增加。

我留意了一下,贴主的赞成票数目在半天内猛增了一百票以上,这说明了什么?????

忠告贴主不要做影响论坛气氛的事情。

JR管理员会严肃查处此事。
评论人:doctorjz 发表时间: Wed Dec 31 20:50:17 CST 2003
真是不要脸,看看那个人的长相就知道了是卑鄙小人了。哈哈
建议把贴主的名字取消掉!!!!!!!
评论人:debug 发表时间: Thu Jan 01 05:27:31 CST 2004
为一个小奖值得吗?为一个小奖值得吗?为一个小奖值得吗?为一个小奖值得吗?为一个小奖值得吗?为一个小奖值得吗?
springouting好像是个托儿,要不就是王婆自己!呵呵
游客: ly 发表时间: Thu Jan 01 05:37:22 CST 2004
评奖办法中不是有抄袭者一经查实,即刻取消参评资格吗?强烈要求JR管理员取消他的参凭资格!
评论人:huhw 发表时间: Thu Jan 01 06:00:00 CST 2004
强烈要求取消楼主的参评资格!!!否则,其它优秀作者还有什么积极性,如此下去,JR被一些无耻小人的东拼西凑的文章充斥,我们也就没有有价值的文章可读了。像这样的文章竟然还都被投10甚至20多张赞成票,可以算是JR中超级5星级文章了,但大家的评论好像没有这么多人叫好啊?仔细看了他的其它文章,说一点价值也没有是有点偏激,因为垃圾也不能说是毫无价值的。连糊涂人也明白是怎么回事,nepalon(拿破轮?)做事要对得起自己的良心啊!你可以争取自己的利益,但是请不要以损伤大家的利益为代价!

建议你就自裁了吧,呵呵,免得在大家的一片叫骂声中丢尽脸面。不就是想领奖吗?我不在乎JR把奖品发给谁(声明:我是近期才发现JR的,没有发表过任何文章,但在JR读了很多好文章!没有靠攻击你来提高自己名次的目的。再说,这样有意义吗?),但是如果因此打击了优秀作者的写作积极性,那就损伤了大家的利益!难道JR的净土就要被你这样的人玷污了吗?

强烈要求取消楼主的参评资格!!!
强烈要求取消楼主的参评资格!!!
强烈要求取消楼主的参评资格!!!
强烈要求取消楼主的参评资格!!!
强烈要求取消楼主的参评资格!!!

----------- 写于2004年新年凌晨-----------
(同意者请多多转贴!)
评论人:zhouyx 发表时间: Thu Jan 01 10:41:50 CST 2004
本人所感兴趣的是keerbritney falltang togetherj 这三个人是不是都帮他的文章加过很多分呢:)
评论人:zhouyx 发表时间: Thu Jan 01 10:50:12 CST 2004
看了大家的评论,我个人觉得有些东西还是比较偏激的,出这个文章的人虽然目的不太纯洁,但是毕竟是付出劳动的,而且文章也写了不少。虽然不怎么样,但是大家也得到了一些知识的共享,我们应该辨证的看待这个问题。我建议管理员把他的可疑的票去掉后,按照规则评一个等级,最多再作为惩罚,降一个等级就可以了,这样比较公正。同时也激励了斑竹下次再做好文章
评论人:togetherj 发表时间: Fri Jan 02 12:49:41 CST 2004
唉,各位高手不要争论了,看看作者的《log4j使用进阶》吧,不错,如果能为我解答问题那我就谢谢你们了,其实这个网站不就是用来交流技术的吗?能自己学知识,帮助别人学知识我认为是最重要的其他的无所谓^_^

这个文章共有 14 条评论
主题: JAVA规则 中级篇 上一篇文章
返回文章列表 返回〔第三方类库〕
下一篇文章 主题: JVM结构基础(一)


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号