﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xjchome-文章分类-Log4J </title><link>http://www.blogjava.net/xjchome/category/6280.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 06:49:10 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 06:49:10 GMT</pubDate><ttl>60</ttl><item><title>Log4J 学习笔记（3）</title><link>http://www.blogjava.net/xjchome/articles/25232.html</link><dc:creator>Java 天下</dc:creator><author>Java 天下</author><pubDate>Fri, 23 Dec 2005 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/xjchome/articles/25232.html</guid><wfw:comment>http://www.blogjava.net/xjchome/comments/25232.html</wfw:comment><comments>http://www.blogjava.net/xjchome/articles/25232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xjchome/comments/commentRss/25232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xjchome/services/trackbacks/25232.html</trackback:ping><description><![CDATA[<DIV>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD width="75%"><FONT color=#808080>本文由 </FONT><A href="mailto:hitonyang@yahoo.com.cn"><FONT color=#808080>Hilton</FONT></A><FONT color=#808080> 所撰写 版权归属于 </FONT><A href="http://hedong.3322.org/"><FONT color=#808080>Hilton</FONT></A><BR><FONT color=#808080>如需转载请来信告知 hitonyang@yahoo.com.cn </FONT></TD>
<TD><A href="http://www.sentom.net/" target=_blank><FONT color=#808080><IMG style="BORDER-RIGHT: rgb(119,119,119) 1px solid; BORDER-TOP: rgb(119,119,119) 1px solid; BORDER-LEFT: rgb(119,119,119) 1px solid; BORDER-BOTTOM: rgb(119,119,119) 1px solid" height=29 src="http://www.sentom.net/images/logo1.gif" width=86 border=0></FONT></A><FONT color=#808080> </FONT></TD></TR></TBODY></TABLE><FONT color=#808080>
<HR SIZE=1>
<BR></FONT>
<P><FONT color=#808080>　　我这儿有两个程序，一个是普通的java程序，实现了一个“九九表”；另一个是servlet。我这儿用的tomcat是4.1.12，J2SE是1.3.1，log4j的版本是1.2.8.</FONT></P><A name=more></A>
<P><FONT color=#808080>一、九九表。<BR>环境设置：需要将log4j-1.2.8.jar放入CLASSPATH变量中。<BR>Hello.java文件的内容如下：<BR></FONT>
<DIV class=code><PRE><FONT color=#808080>import org.apache.log4j.*;<BR>public class Hello{<BR>	static Logger logger = Logger.getLogger(Hello.class);<BR>	public static void main(String[] args) {<BR>	int i,j;<BR>//	  BasicConfigurator.configure();<BR>	  PropertyConfigurator.configure(args[0]);<BR><BR>      logger.info("Entering application.");<BR>      for(i=1;i&lt;10;i++){<BR>	    logger.debug(""+i);<BR>      	for (j=1;j&lt;=i;j++){<BR>      		logger.warn(""+j);<BR>      		System.out.print(i*j);<BR>      		System.out.print("\t");<BR>      	}<BR>      	System.out.println("");<BR>    	}<BR>      logger.info("Exiting application.");	  <BR>}<BR></FONT></PRE></DIV><BR><FONT color=#808080>log4j的配置文件log4j.inf的内容如下： </FONT>
<DIV class=code><PRE><FONT color=#808080>log4j.rootLogger=WARN, stdout, R<BR><BR>log4j.appender.stdout=org.apache.log4j.ConsoleAppender<BR>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<BR><BR># Pattern to output the caller's file name and line number.<BR>#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n<BR># Print the date in ISO 8601 format<BR>log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n<BR><BR>log4j.appender.R=org.apache.log4j.RollingFileAppender<BR>log4j.appender.R.File=example.log<BR><BR>log4j.appender.R.MaxFileSize=100KB<BR># Keep one backup file<BR>log4j.appender.R.MaxBackupIndex=1<BR><BR>log4j.appender.R.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n<BR><BR># Print only messages of level WARN or above in the package com.foo.<BR>log4j.logger.com.foo=WARN</FONT></PRE></DIV><BR><FONT color=#808080>运行： </FONT>
<DIV class=code><FONT color=#808080>javac Hello.java<BR>java Hello log4j.inf</FONT></DIV><BR><FONT color=#808080>结果会在屏幕上显示，并在example.log文件中记录。 </FONT>
<P></P>
<P><FONT color=#808080>二、servlet<BR>环境设置：将log4j-1.2.8.jar及servlet.jar放入环境变量CLASSPATH中，并且要将log4j-1.2.8复制到$TOMCAT_HOME/common/lib目录下。<BR>假定，有一个布署到tomcat的应用叫myweb。<BR>servlet程序Log4jInit.java的位置在$TOMCAT_HOME/webapps/myweb/WEB-INF/classes/com/hedong/learning/log4j/目录下，内容如下： </FONT>
<DIV class=code><PRE><FONT color=#808080>package com.hedong.learning.log4j;<BR>import org.apache.log4j.*;<BR>import javax.servlet.http.HttpServlet;<BR>import javax.servlet.http.HttpServletRequest;<BR>import javax.servlet.http.HttpServletResponse;<BR>public class Log4jInit extends HttpServlet {<BR>  public void init() {<BR>        String prefix =  getServletContext().getRealPath("/");<BR>        String file = getInitParameter("log4j");<BR>        // if the log4j-init-file is not set, then no point in trying<BR>        System.out.println("................log4j start");<BR>        if(file != null) {<BR>          PropertyConfigurator.configure(prefix+file);<BR>        }<BR>  }<BR>public void doGet(HttpServletRequest req, HttpServletResponse res) {<BR>  }<BR>}</FONT></PRE></DIV><BR><FONT color=#808080>在Log4jInit.java所在目录下编译它: </FONT>
<DIV class=code><PRE><FONT color=#808080>javac Log4jInit.java</FONT></PRE></DIV><BR><FONT color=#808080>myweb的设置文件web.xml在$TOMCAT_HOME/webapps/myweb/WEB-INF/目录下，增加如下红色部分。 </FONT>
<DIV class=code><PRE><FONT color=#808080>&lt;/web-app&gt;<BR>  ...........<BR></FONT><FONT color=#808080><INS>  &lt;servlet&gt;<BR>    &lt;servlet-name&gt;log4j-init&lt;/servlet-name&gt;<BR>    &lt;servlet-class&gt;com.hedong.learning.log4j.Log4jInit&lt;/servlet-class&gt;<BR>    &lt;init-param&gt;<BR>      &lt;param-name&gt;log4j&lt;/param-name&gt;<BR>      &lt;param-value&gt;WEB-INF/log4j.properties&lt;/param-value&gt;<BR>    &lt;/init-param&gt;<BR>    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<BR>  &lt;/servlet&gt;</INS><BR>&lt;/web-app&gt;</FONT></PRE></DIV><BR><FONT color=#808080>同时，在这个目录下建一个文件名叫log4j.properties，内容如下： </FONT>
<DIV class=code><PRE><FONT color=#808080>log4j.rootLogger=INFO, A1 , R<BR>log4j.appender.A1=org.apache.log4j.ConsoleAppender <BR>log4j.appender.A1.layout=org.apache.log4j.PatternLayout <BR>log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n <BR>log4j.appender.R=org.apache.log4j.RollingFileAppender<BR>log4j.appender.R.File=$TOMCAT_HOME/webapps/dbweb/logs/log4j.log<INS>&lt;----将$TOMCAT_HOME换成tomcat的安装目录</INS><BR>log4j.appender.R.MaxFileSize=100KB<BR>log4j.appender.R.MaxBackupIndex=1<BR>log4j.appender.R.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n</FONT></PRE></DIV><BR><FONT color=#808080>记住，别忘了创建目录$TOMCAT_HOME/webapps/dbweb/logs/，如果它不存在的话。<BR>创建目录$TOMCAT_HOME/webapps/dbweb/test/，然后在这个目录下新建一个文件test.jsp,内容如下： </FONT>
<DIV class=code><PRE><FONT color=#808080>&lt;%@ page contentType="text/html; charset=GB2312" %&gt;<BR>&lt;%@ page import="org.apache.log4j.*" %&gt;<BR>&lt;%<BR>       Logger logger = Logger.getLogger("test.jsp");<BR>       logger.info("befor say hi");<BR>%&gt;<BR>&lt;h1&gt; Hi&lt;/h1&gt;<BR>&lt;%<BR>        logger.info("after say hi");<BR>%&gt;</FONT></PRE></DIV><BR><FONT color=#808080>然后，重新启动tomcat，通过浏览器访问这个jsp页面，如http://yourdomain.com:8080/myweb/test/test.jsp，如果一切正常，会看到一个大大的HI。然后，在服务器上的$TOMCAT_HOME/webapps/dbweb/logs/log4j.log文件中看到如下的信息： </FONT>
<DIV class=code><FONT color=#808080>INFO HttpProcessor[8080][4] test.jsp - befor say hi<BR>INFO HttpProcessor[8080][4] test.jsp - after say hi</FONT></DIV><FONT color=#808080>。在默认的情况下，tomcat的屏幕输出被重定向到$TOMCAT_HOME/logs/catalina.out文件中，在文件的最后也应看到上述的输出。<BR></FONT>
<P></P></DIV><BR><BR>
<P align=right><FONT color=#808080>原作者：Hilton<BR>来 源：http://hedong.3322.org/<BR></FONT></P><img src ="http://www.blogjava.net/xjchome/aggbug/25232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xjchome/" target="_blank">Java 天下</a> 2005-12-23 16:36 <a href="http://www.blogjava.net/xjchome/articles/25232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4J 学习笔记（1）</title><link>http://www.blogjava.net/xjchome/articles/25230.html</link><dc:creator>Java 天下</dc:creator><author>Java 天下</author><pubDate>Fri, 23 Dec 2005 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/xjchome/articles/25230.html</guid><wfw:comment>http://www.blogjava.net/xjchome/comments/25230.html</wfw:comment><comments>http://www.blogjava.net/xjchome/articles/25230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xjchome/comments/commentRss/25230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xjchome/services/trackbacks/25230.html</trackback:ping><description><![CDATA[<DIV>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD width="75%"><FONT color=#808080>本文由 </FONT><A href="mailto:hitonyang@yahoo.com.cn"><FONT color=#808080>Hilton</FONT></A><FONT color=#808080> 所撰写 版权归属于 </FONT><A href="http://hedong.3322.org/"><FONT color=#808080>Hilton</FONT></A><BR><FONT color=#808080>如需转载请来信告知 hitonyang@yahoo.com.cn </FONT></TD>
<TD><A href="http://www.sentom.net/" target=_blank><FONT color=#808080><IMG style="BORDER-RIGHT: rgb(119,119,119) 1px solid; BORDER-TOP: rgb(119,119,119) 1px solid; BORDER-LEFT: rgb(119,119,119) 1px solid; BORDER-BOTTOM: rgb(119,119,119) 1px solid" height=29 src="http://www.sentom.net/images/logo1.gif" width=86 border=0></FONT></A><FONT color=#808080> </FONT></TD></TR></TBODY></TABLE><FONT color=#808080>
<HR SIZE=1>
<BR></FONT>
<P><A href="http://jakarta.apache.org/log4j/docs/index.html"><FONT color=#808080><IMG alt=log4jlogo.jpg src="http://jakarta.apache.org/log4j/docs/images/logo.jpg" align=left border=0></FONT></A><BR><BR><FONT color=#808080>说实话，除了log4j的功能外，我更喜欢它的logo.<BR>下面的这篇笔记，主要是"borrow from"Log4J的随机文档"Short introduction to log4j"，由Ceki Gülcü 写于March 2002，其它参考文档见文后。<BR></FONT></P><BR>
<P><FONT color=#808080>1、log4j已经被移植到C, C++, C#, Perl, Python, Ruby, Eiffel 几种语言。<BR>2、log4j有三种主要的<ACRONYM title=component>组件</ACRONYM>：<ACRONYM title=logger>记录器</ACRONYM>,<ACRONYM title=appender>存放器</ACRONYM>,<ACRONYM title=layout>布局</ACRONYM><BR>3、记录器（记录器可不关心log数据存放的事哟）<BR>　　log4j允许程序员定义多个记录器，每个记录器有自己的名字，记录器之间通过名字来表明隶属关系（或家族关系）。列如，记录器a.b,与记录器a.b.c之间是父子关系，而记录器a与a.b.c之间是祖先与后代的关系，父子关系是祖先与后代关系的特例。通过这种关系，可以描述不同记录器之间的逻辑关系。<BR>　　有一个记录器叫根记录器，它永远存在，且不能通过名字检索或引用，可以通过Logger.getRootLogger()方法取得它，而一般记录器通过Logger.getLogger(String name)方法。下面是Logger类的基本方法。 </FONT>
<DIV class=code><FONT color=#808080>package org.apache.log4j; </FONT>
<P></P>
<P><FONT color=#808080>public class Logger {</FONT></P>
<P><FONT color=#808080>// Creation &amp; retrieval methods:<BR>public static Logger getRootLogger();<BR>public static Logger getLogger(String name);</FONT></P>
<P><FONT color=#808080>// printing methods:<BR>public void debug(Object message);<BR>public void info(Object message);<BR>public void warn(Object message);<BR>public void error(Object message);<BR>public void fatal(Object message);</FONT></P>
<P><FONT color=#808080>// generic printing method:<BR>public void log(Level l, Object message);<BR>}</FONT></P></DIV><BR><FONT color=#808080>　　记录器还有一个重要的属性，就是级别。（这好理解，就象一个家庭中，成员间存在辈份关系，但不同的成员的身高可能不一样，且身高与辈份无关）程序员可以给不同的记录器赋以不同的级别，如果某个成员没有被明确值，就自动继承最近的一个有级别长辈的级别值。根记录器总有级别值。例如：<BR></FONT>
<DIV class=code>
<TABLE border=1>
<TBODY>
<TR>
<TD><FONT color=#808080>记录器名</FONT></TD>
<TD><FONT color=#808080>赋予的级别值</FONT></TD>
<TD><FONT color=#808080>继承的级别值</FONT></TD></TR>
<TR>
<TD><FONT color=#808080>root</FONT></TD>
<TD><FONT color=#808080>Proot</FONT></TD>
<TD><FONT color=#808080>Proot</FONT></TD></TR>
<TR>
<TD><FONT color=#808080>X </FONT></TD>
<TD><FONT color=#808080>Px </FONT></TD>
<TD><FONT color=#808080>Px </FONT></TD></TR>
<TR>
<TD><FONT color=#808080>X.Y </FONT></TD>
<TD><FONT color=#808080>none </FONT></TD>
<TD><FONT color=#808080>Px </FONT></TD></TR>
<TR>
<TD><FONT color=#808080>X.Y.Z</FONT></TD>
<TD><FONT color=#808080>none </FONT></TD>
<TD><FONT color=#808080>Px </FONT></TD></TR></TBODY></TABLE></DIV><BR><FONT color=#808080>　　程序员可以自由定义级别。级别值之间存在偏序关系，如上面几种级别就有关系DEBUG<INFO<WARN<ERROR<FATAL.<BR /> 　　每一条要输出的log信息，也有一个级别值。<BR>　　前面的Logger类中，就预定义了 DEBUG, INFO, WARN, ERROR ，FATAL几种级别，由于与方法绑定，让人易产生误解，其实这几个方法只不过表明了要记录的log信息的级别。当调用log()方法时，log信息的级别就需要在通过参数明确指定。<BR>　　如果一条log信息的级别，大于等于记录器的级别值，那么记录器就会记录它。如果你觉得难以理解，可参考下例。 </FONT>
<DIV class=code><FONT color=#808080>&nbsp;&nbsp;&nbsp;//&nbsp;get&nbsp;a&nbsp;logger&nbsp;instance&nbsp;named&nbsp;"com.foo"<BR>&nbsp;&nbsp;&nbsp;Logger&nbsp;&nbsp;logger&nbsp;=&nbsp;Logger.getLogger("com.foo"); </FONT>
<P></P>
<P><FONT color=#808080>&nbsp;&nbsp;&nbsp;//&nbsp;Now&nbsp;set&nbsp;its&nbsp;level.&nbsp;Normally&nbsp;you&nbsp;do&nbsp;not&nbsp;need&nbsp;to&nbsp;set&nbsp;the<BR>&nbsp;&nbsp;&nbsp;//&nbsp;level&nbsp;of&nbsp;a&nbsp;logger&nbsp;programmatically.&nbsp;This&nbsp;is&nbsp;usually&nbsp;done<BR>&nbsp;&nbsp;&nbsp;//&nbsp;in&nbsp;configuration&nbsp;files.<BR>&nbsp;&nbsp;&nbsp;logger.setLevel(Level.INFO);</FONT></P>
<P><FONT color=#808080>&nbsp;&nbsp;&nbsp;Logger&nbsp;barlogger&nbsp;=&nbsp;Logger.getLogger("com.foo.Bar");</FONT></P>
<P><FONT color=#808080>&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;request&nbsp;is&nbsp;enabled,&nbsp;because&nbsp;WARN&nbsp;&gt;=&nbsp;INFO.<BR>&nbsp;&nbsp;&nbsp;logger.warn("Low&nbsp;fuel&nbsp;level.");</FONT></P>
<P><FONT color=#808080>&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;request&nbsp;is&nbsp;disabled,&nbsp;because&nbsp;DEBUG&nbsp;&lt;&nbsp;INFO.<BR>&nbsp;&nbsp;&nbsp;logger.debug("Starting&nbsp;search&nbsp;for&nbsp;nearest&nbsp;gas&nbsp;station.");</FONT></P>
<P><FONT color=#808080>&nbsp;&nbsp;&nbsp;//&nbsp;The&nbsp;logger&nbsp;instance&nbsp;barlogger,&nbsp;named&nbsp;"com.foo.Bar",<BR>&nbsp;&nbsp;&nbsp;//&nbsp;will&nbsp;inherit&nbsp;its&nbsp;level&nbsp;from&nbsp;the&nbsp;logger&nbsp;named<BR>&nbsp;&nbsp;&nbsp;//&nbsp;"com.foo"&nbsp;Thus,&nbsp;the&nbsp;following&nbsp;request&nbsp;is&nbsp;enabled<BR>&nbsp;&nbsp;&nbsp;//&nbsp;because&nbsp;INFO&nbsp;&gt;=&nbsp;INFO.<BR>&nbsp;&nbsp;&nbsp;barlogger.info("Located&nbsp;nearest&nbsp;gas&nbsp;station.");</FONT></P>
<P><FONT color=#808080>&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;request&nbsp;is&nbsp;disabled,&nbsp;because&nbsp;DEBUG&nbsp;&lt;&nbsp;INFO.<BR>&nbsp;&nbsp;&nbsp;barlogger.debug("Exiting&nbsp;gas&nbsp;station&nbsp;search");</FONT></P></DIV><BR><FONT color=#808080>　　有几个有趣的情况，一是当一个记录器实例化后，再一次用相同的名字调用getLogger()会返回对它的引用，这非常有利于用同一个记录器在不同代码或类中记录log信息，另一个是与自然界中祖先先于后代出现不同，一个记录器的祖先可以比后代记录出现的晚，但会自动根据名字之间的关系建立这种家族关系。 </FONT>
<P></P>
<P><FONT color=#808080>4、存放器<BR>　　在log4j中，log信息通过存放器输出到目的地。支持的存放器有console, files, GUI components, remote socket servers, JMS, NT Event Loggers, remote UNIX Syslog daemons。通过file存放器，log信息可以被输出到不同的文件中（即不同的目的地）。log信息可被异步存放。<BR>　　一个记录器可以有多个存放器，可以通过方法addAppender来增加存放器。一条blog信息如果可被这个记录器处理，则记录器会把这条信息送往每个它所拥有的存放器。<BR>　　每个记录器有一个<ACRONYM title="additivity flag ">继承开关</ACRONYM>,其开关决定记录器是/否继承其父记录器的存放器，注意，如果继承则只继承其父记录器，而不考虑更远的祖先的情况。参考下表：<BR></FONT>
<TABLE border=1>
<TBODY>
<TR>
<TD><FONT color=#808080>记录器</FONT></TD>
<TD><FONT color=#808080>增加的存放器</FONT></TD>
<TD><FONT color=#808080>继承的存放器</FONT></TD>
<TD><FONT color=#808080>输出的目的地</FONT></TD>
<TD><FONT color=#808080>备注</FONT></TD></TR>
<TR>
<TD><FONT color=#808080>root</FONT></TD>
<TD><FONT color=#808080>A1</FONT></TD>
<TD><FONT color=#808080>not applicable</FONT></TD>
<TD><FONT color=#808080>A1</FONT></TD>
<TD><FONT color=#808080>The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root.</FONT></TD></TR>
<TR>
<TD><FONT color=#808080>x</FONT></TD>
<TD><FONT color=#808080>A-x1, A-x2</FONT></TD>
<TD><FONT color=#808080>TRUE</FONT></TD>
<TD><FONT color=#808080>A1, A-x1, A-x2</FONT></TD>
<TD><FONT color=#808080>Appenders of "x" and root.</FONT></TD></TR>
<TR>
<TD><FONT color=#808080>x.y</FONT></TD>
<TD><FONT color=#808080>none</FONT></TD>
<TD><FONT color=#808080>TRUE</FONT></TD>
<TD><FONT color=#808080>A1, A-x1, A-x2</FONT></TD>
<TD><FONT color=#808080>Appenders of "x" and root.</FONT></TD></TR>
<TR>
<TD><FONT color=#808080>x.y.z</FONT></TD>
<TD><FONT color=#808080>A-xyz1</FONT></TD>
<TD><FONT color=#808080>TRUE</FONT></TD>
<TD><FONT color=#808080>A1, A-x1, A-x2, A-xyz1</FONT></TD>
<TD><FONT color=#808080>Appenders in "x.y.z", "x" and root.</FONT></TD></TR>
<TR>
<TD><FONT color=#808080>security</FONT></TD>
<TD><FONT color=#808080>A-sec</FONT></TD>
<TD><FONT color=#808080>FALSE</FONT></TD>
<TD><FONT color=#808080>A-sec</FONT></TD>
<TD><FONT color=#808080>No appender accumulation since the additivity flag is set to false.</FONT></TD></TR>
<TR>
<TD><FONT color=#808080>security.access</FONT></TD>
<TD><FONT color=#808080>none</FONT></TD>
<TD><FONT color=#808080>TRUE</FONT></TD>
<TD><FONT color=#808080>A-sec</FONT></TD>
<TD><FONT color=#808080>Only appenders of "security" because the additivity flag in "security" is set to false.</FONT></TD></TR></TBODY></TABLE><FONT color=#808080>　　<BR>　　<BR>5、布局<BR>　　布局负责格式化输出的log信息。log4j的PatternLayout可以让程序以类似C语言printf的格式化模板来定义格式。</FONT></P>
<P><FONT color=#808080>6、log4j可据程序员制定的标准自动提供一些log信息，这对那类需要频繁log的对象的情况很帮助。对象的自动log，具有继承性。</FONT></P>
<P><FONT color=#808080>参考文献：<BR>1、log4j--新的日志操作方法，scriptskychen ，http://www.cn-java.com/target/news.php?news_id=2590<BR></FONT></P></DIV><BR><BR>
<P align=right><FONT color=#808080>原作者：Hilton<BR>来 源：http://hedong.3322.org/<BR>共有9588位读者阅读过此文 </FONT></P><img src ="http://www.blogjava.net/xjchome/aggbug/25230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xjchome/" target="_blank">Java 天下</a> 2005-12-23 16:35 <a href="http://www.blogjava.net/xjchome/articles/25230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4J 学习笔记（2）</title><link>http://www.blogjava.net/xjchome/articles/25231.html</link><dc:creator>Java 天下</dc:creator><author>Java 天下</author><pubDate>Fri, 23 Dec 2005 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/xjchome/articles/25231.html</guid><wfw:comment>http://www.blogjava.net/xjchome/comments/25231.html</wfw:comment><comments>http://www.blogjava.net/xjchome/articles/25231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xjchome/comments/commentRss/25231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xjchome/services/trackbacks/25231.html</trackback:ping><description><![CDATA[<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD width="75%"><FONT color=#808080>本文由 </FONT><A href="mailto:hitonyang@yahoo.com.cn"><FONT color=#808080>Hilton</FONT></A><FONT color=#808080> 所撰写 版权归属于 </FONT><A href="http://hedong.3322.org/"><FONT color=#808080>Hilton</FONT></A><BR><FONT color=#808080>如需转载请来信告知 hitonyang@yahoo.com.cn </FONT></TD>
<TD><A href="http://www.sentom.net/" target=_blank><FONT color=#808080><IMG style="BORDER-RIGHT: rgb(119,119,119) 1px solid; BORDER-TOP: rgb(119,119,119) 1px solid; BORDER-LEFT: rgb(119,119,119) 1px solid; BORDER-BOTTOM: rgb(119,119,119) 1px solid" height=29 src="http://www.sentom.net/images/logo1.gif" width=86 border=0></FONT></A><FONT color=#808080> </FONT></TD></TR></TBODY></TABLE><FONT color=#808080>
<HR SIZE=1>
<BR></FONT>
<P><FONT color=#808080>　　前面主要记了一些原理，这次是实务。</FONT></P><A name=more></A>
<P><FONT color=#808080>1、研究发现，一个系统中4%的代码是用来作logging的。<BR>2、Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的，它可接key=value格式的设置或xml格式的设置信息。通过配置，可以创建出Log4J的运行环境。<BR>　　Log4J运行时，不对环境做任何假定，尤其是没有默认的存放器。<BR>3、有几种方式可以配置Log4J<BR>1）在程序中调用BasicConfigurator.configure()方法；<BR>2）配置放在文件里，通过命令行参数传递文件名字，通过PropertyConfigurator.configure(args[x])解析并配置；<BR>3）配置放在文件里，通过环境变量传递文件名等信息，利用log4j默认的初始化过程解析并配置；<BR>4）配置放在文件里，通过应用服务器配置传递文件名等信息，利用一个特殊的servlet来完成配置。<BR>看下面的例子： </FONT>
<DIV class=code><PRE><FONT color=#808080>import com.foo.Bar;<BR>
 // Import log4j classes.<BR>
 import org.apache.log4j.Logger;<BR>
 import org.apache.log4j.BasicConfigurator;<BR>
 public class MyApp {<BR>
   // Define a static logger variable so that it references the<BR>
   // Logger instance named "MyApp".<BR>
<INS>   static Logger logger = Logger.getLogger(MyApp.class);</INS><BR>
   public static void main(String[] args) {<BR>
     // Set up a simple configuration that logs on the console.<BR>
<INS>     BasicConfigurator.configure();</INS><BR>
     logger.info("Entering application.");<BR>
     Bar bar = new Bar();<BR>
     bar.doIt();<BR>
     logger.info("Exiting application.");<BR>
   }<BR>
 }</FONT></PRE></DIV><BR>
<DIV class=code><PRE><FONT color=#808080> package com.foo;<BR>
 import org.apache.log4j.Logger;</FONT><P></P>

<P><FONT color=#808080> public class Bar {<BR>
<INS>   static Logger logger = Logger.getLogger(Bar.class);</INS><BR>
   public void doIt() {<BR>
     logger.debug("Did it again!");<BR>
   }<BR>
 }</FONT></P></PRE></DIV><BR><FONT color=#808080>　　BasicConfigurator.configure给根记录器增加一个ConsoleAppender，输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n"，还有根记录器的默认级别是Level.DEBUG. <BR>　　记录器之间的关系如下图：<BR>　　 </FONT>
<CENTER><FONT color=#808080><IMG height=288 alt=log4jexample.gif src="http://hedong.3322.org/archives/pics/log4jexample.gif" width=596 border=0></FONT></CENTER><BR><FONT color=#808080>　　输出结果如下： </FONT>
<DIV class=code><FONT color=#808080>0 [main] INFO MyApp - Entering application.<BR>36 [main] DEBUG com.foo.Bar - Did it again!<BR>51 [main] INFO MyApp - Exiting application.</FONT></DIV><BR><FONT color=#808080>　　下面的代码结合配置信息，会得到与上述程序一样的结果。 </FONT>
<DIV class=code><PRE><FONT color=#808080>import com.foo.Bar;<BR>
 import org.apache.log4j.Logger;<BR>
<INS> import org.apache.log4j.PropertyConfigurator;</INS><BR>
 public class MyApp {<BR>
   static Logger logger = Logger.getLogger(MyApp.class.getName());<BR>
   public static void main(String[] args) {<BR>
     // BasicConfigurator replaced with PropertyConfigurator.<BR>
<INS>     PropertyConfigurator.configure(args[0]);</INS><BR>
     logger.info("Entering application.");<BR>
     Bar bar = new Bar();<BR>
     bar.doIt();<BR>
     logger.info("Exiting application.");<BR>
   }<BR>
 }<BR>
</FONT></PRE></DIV><FONT color=#808080>配置文件的内容如下： </FONT>
<DIV class=code><FONT color=#808080># Set root logger level to DEBUG and its only appender to A1.<BR>log4j.rootLogger=DEBUG, A1 </FONT>
<P></P>
<P><FONT color=#808080># A1 is set to be a ConsoleAppender.<BR>log4j.appender.A1=org.apache.log4j.ConsoleAppender</FONT></P>
<P><FONT color=#808080># A1 uses PatternLayout.<BR>log4j.appender.A1.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n</FONT></P></DIV><FONT color=#808080>利用配置文件，可以很方便地修改配置。如下例 </FONT>
<DIV class=code><FONT color=#808080>log4j.rootLogger=debug, stdout, R </FONT>
<P></P>
<P><FONT color=#808080>log4j.appender.stdout=org.apache.log4j.ConsoleAppender<BR>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout</FONT></P>
<P><FONT color=#808080># Pattern to output the caller's file name and line number.<BR>#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n<BR># Print the date in ISO 8601 format<BR>log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n</FONT></P>
<P><FONT color=#808080>log4j.appender.R=org.apache.log4j.RollingFileAppender<BR>log4j.appender.R.File=example.log</FONT></P>
<P><FONT color=#808080>log4j.appender.R.MaxFileSize=100KB<BR># Keep one backup file<BR>log4j.appender.R.MaxBackupIndex=1</FONT></P>
<P><FONT color=#808080>log4j.appender.R.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n</FONT></P>
<P><FONT color=#808080># Print only messages of level WARN or above in the package com.foo.<BR>log4j.logger.com.foo=WARN</FONT></P></DIV><BR><FONT color=#808080>对于tomcat4，利用环境变量传递参数的，可参见以下几个例子 </FONT>
<DIV class=code><BR><FONT color=#808080>unix设置<BR>export CATALINA_OPTS ="-Dlog4j.configuration=foobar.txt"<INS>&lt;===用PropertyConfigurator解析</INS><BR>export CATALINA_OPTS ="-Dlog4j.debug -Dlog4j.configuration=foobar.xml"<INS>&lt;===用DOMConfigurator解析</INS><BR>以下是windows设置<BR>set CATALINA_OPTS =-Dlog4j.configuration=foobar.lcf -Dlog4j.configuratorClass=com.foo.BarConfigurator<INS>&lt;===用com.foo.BarConfigurator解析</INS><BR>set CATALINA_OPTS =-Dlog4j.configuration=file:/c:/foobar.lcf</FONT></DIV><FONT color=#808080>配置文件位置如果没有明确指明，则要放在WEB-INF/classes目录下。<BR>4、用servlet配置log4j<BR>以下都是参考冰之火的文章，抄来放在这儿，并做了一些必要的修改。需要说明的是，下面的代码需要自己写并发布，下的jar中没有这个类。<DEL>待我以后写一个，也放上来。</DEL>我也写了两个，在</FONT><A href="http://www.sentom.net/list.asp?id=61"><FONT color=#808080>笔记（三）</FONT></A><FONT color=#808080>中。<BR>在Application目录下的web.xml文件加入以后代码<BR></FONT>
<DIV class=code><PRE><FONT color=#808080>  &lt;servlet&gt;<BR>
    &lt;servlet-name&gt;<DEL>log4j</DEL><INS>log4j-init</INS>&lt;/servlet-name&gt;<BR>
    &lt;servlet-class&gt;com.apache.jakarta.log4j.Log4jInit&lt;/servlet-class&gt;<BR>
    &lt;init-param&gt;<BR>
      &lt;param-name&gt;log4j&lt;/param-name&gt;<BR>
      &lt;param-value&gt;<DEL>/</DEL>WEB-INF/log4j.properties&lt;/param-value&gt;<BR>
    &lt;/init-param&gt;<BR>
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<BR>
  &lt;/servlet&gt;</FONT></PRE></DIV><BR><FONT color=#808080>这段代码的意思是说，在Tomcat启动时加载com.apache.jakarta.log4j.Log4jInit这个名叫Log4jInit.class这个类文件。<BR>其中Log4jInit.class的源代码如下 </FONT>
<DIV class=code><PRE><FONT color=#808080> <BR>
package com.apache.jakarta.log4j;<BR>
import org.apache.log4j.PropertyConfigurator;<BR>
import javax.servlet.http.HttpServlet;<BR>
import javax.servlet.http.HttpServletRequest;<BR>
import javax.servlet.http.HttpServletResponse;<BR>
public class Log4jInit extends HttpServlet {</FONT><P></P>

<P><FONT color=#808080>  public void init() {<BR>
	String prefix =  getServletContext().getRealPath("/");<BR>
	String file = getInitParameter("log4j");<BR>
	// if the log4j-init-file is not set, then no point in trying<BR>
	System.out.println("................log4j start");<BR>
	if(file != null) {<BR>
	  PropertyConfigurator.configure(prefix+file);<BR>
	}<BR>
  }<BR>
public void doGet(HttpServletRequest req, HttpServletResponse res) {<BR>
  }<BR>
}</FONT></P></PRE></DIV><BR><FONT color=#808080>在加载的过程中，程序会读取/WEB-INF/log4j.properties这个文件。<BR>配置文件讲解如下： </FONT>
<DIV class=code><FONT color=#808080># Set root logger level to DEBUG and its only appender to A1 <BR>#log4j中有五级logger <BR>#FATAL 0 <BR>#ERROR 3 <BR>#WARN 4 <BR>#INFO 6 <BR>#DEBUG 7 <BR>#配置根Logger，其语法为：<BR>#log4j.rootLogger = [ level ] , appenderName, appenderName, …<BR>log4j.rootLogger=INFO, A1 ,R<BR>#这一句设置以为着所有的log都输出<BR>#如果为log4j.rootLogger=WARN, 则意味着只有WARN,ERROR,FATAL<BR>#被输出，DEBUG,INFO将被屏蔽掉.<BR># A1 is set to be a ConsoleAppender. <BR>#log4j中Appender有几层如控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等<BR>#ConsoleAppender输出到控制台 <BR>log4j.appender.A1=org.apache.log4j.ConsoleAppender <BR># A1 使用的输出布局，其中log4j提供4种布局. org.apache.log4j.HTMLLayout（以HTML表格形式布局）<BR>#org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<BR>#org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<BR>#org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </FONT>
<P></P>
<P><FONT color=#808080>log4j.appender.A1.layout=org.apache.log4j.PatternLayout <BR>#灵活定义输出格式 具体查看log4j javadoc org.apache.log4j.PatternLayout <BR>#d 时间 .... <BR>log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n <BR>#R 输出到文件 RollingFileAppender的扩展，可以提供一种日志的备份功能。<BR>log4j.appender.R=org.apache.log4j.RollingFileAppender <BR>#日志文件的名称<BR>log4j.appender.R.File=log4j.log <BR>#日志文件的大小<BR>log4j.appender.R.MaxFileSize=100KB <BR># 保存一个备份文件<BR>log4j.appender.R.MaxBackupIndex=1 </FONT></P>
<P><FONT color=#808080>log4j.appender.R.layout=org.apache.log4j.TTCCLayout<BR>#log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n</FONT></P></DIV><BR><FONT color=#808080>配置根Logger，其语法为：<BR></FONT>
<DIV class=code><FONT color=#808080>log4j.rootLogger = [ level ] , appenderName, appenderName, ...</FONT></DIV><BR><FONT color=#808080>level 是日志记录的优先级<BR>appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 </FONT>
<P></P>
<P><FONT color=#808080>配置日志信息输出目的地Appender，其语法为<BR></FONT>
<DIV class=code><FONT color=#808080>log4j.appender.appenderName = fully.qualified.name.of.appender.class<BR>log4j.appender.appenderName.option1 = value1<BR>...<BR>log4j.appender.appenderName.option = valueN</FONT></DIV><BR><FONT color=#808080>Log4j提供的appender有以下几种：<BR>org.apache.log4j.ConsoleAppender（控制台），<BR>org.apache.log4j.FileAppender（文件），<BR>org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<BR>org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<BR>org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） </FONT>
<P></P>
<P><FONT color=#808080>配置日志信息的格式（布局），其语法为：<BR></FONT>
<DIV class=div><FONT color=#808080>log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<BR>log4j.appender.appenderName.layout.option1 = value1<BR>....<BR>log4j.appender.appenderName.layout.option = valueN</FONT></DIV><BR><FONT color=#808080>Log4j提供的layout有以下几种：<BR>org.apache.log4j.HTMLLayout（以HTML表格形式布局），<BR>org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<BR>org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<BR>org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </FONT>
<P></P><BR><BR>
<P align=right><FONT color=#808080>原作者：Hilton<BR>来 源：http://hedong.3322.org/<BR></FONT></P><img src ="http://www.blogjava.net/xjchome/aggbug/25231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xjchome/" target="_blank">Java 天下</a> 2005-12-23 16:35 <a href="http://www.blogjava.net/xjchome/articles/25231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>