﻿<?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-helloworld-随笔分类-log4j</title><link>http://www.blogjava.net/zhaochengming/category/24910.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Aug 2007 13:37:20 GMT</lastBuildDate><pubDate>Mon, 13 Aug 2007 13:37:20 GMT</pubDate><ttl>60</ttl><item><title>Manual de Log4J</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136491.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136491.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136491.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136491.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Manual de Log4JMauricio Santacruz, VimeWorks Cia. Ltda.Este documento est&#225; publicado bajo los t&#233;rminos de la Apache Software License, una copia dedicha licencia se encuentra en http://...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhaochengming/archive/2007/08/13/136491.html'>阅读全文</a><img src ="http://www.blogjava.net/zhaochengming/aggbug/136491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 19:09 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j 2 转</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136490.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 11:04:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136490.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136490.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136490.html</trackback:ping><description><![CDATA[<p>一 最好与commons-logging一起用，why？</p>
<p>&nbsp;&nbsp;&nbsp; 1.标准接口，即使将来脱离了log4j也一样用<br>&nbsp;&nbsp;&nbsp; 2.简化了编码，减少耦合度：不需在代码中指定log4j配制文件位置，代码中不需要引用log4j的包<br>&nbsp;&nbsp;&nbsp; 3.基本所有框架都是这么用的。。。。。。（我相信群众）</p>
<p>&nbsp;&nbsp;&nbsp; 附加提供一下commons-logging寻找配置文件的顺序（从别人那抄的）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1) 首先在classpath下寻找自己的配置文件commons-logging.properties，如果找到，则使用其中定义的Log实现类；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) 如果找不到commons-logging.properties文件，则在查找是否已定义系统环境变量org.apache.commons.logging.Log，找到则使用其定义的Log实现类；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3) 否则，查看classpath中是否有Log4j的包，如果发现，则自动使用Log4j作为日志实现类；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4) 否则，使用JDK自身的日志实现类（JDK1.4以后才有日志实现类）；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5) 否则，使用commons-logging自己提供的一个简单的日志实现类SimpleLog；</p>
<p><br>二 具体实现</p>
<p>&nbsp;&nbsp;&nbsp; 1.把commons-logging的jar加到classpath中<br>&nbsp;&nbsp;&nbsp; 2.把log4j的jar加到classpath中<br>&nbsp;&nbsp;&nbsp; 3.在classpath的根目录下，建立log4j.properties(必须是这个地方，必须叫这个名,才不用特殊配置)，可以直接复制后边的模板<br>&nbsp;&nbsp;&nbsp; 4.在需要log的类中:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import org.apache.commons.logging.Log;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import org.apache.commons.logging.LogFactory;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static Log log = LogFactory.getLog(xxxx.class);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么要使用static？因为避免产生多个实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么不使用this.class？因为是static不能用this（我经常犯这个错误。。。）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么不使new XXXX().getClass()？因为。。。。你猜呢？<br>&nbsp;&nbsp;&nbsp; 5.根据实际需要log.debug()、log.info()、log.warn()、log.error()、log.fatal()&nbsp;&nbsp;&nbsp; 就可以输出不同等级的log</p>
<p><br>三 log的等级</p>
<p>&nbsp;&nbsp;&nbsp; 1.为什么需要等级？写代码的时候可能需要很多调试信息，运行的时候可能需要显示提示信息，如果在服务器上发生严重错误的时候，可能需要给管理员发邮件。这种：调试，提示，错误就是等级。<br>&nbsp;&nbsp;&nbsp; 2.都有什么等级？ 调试(DEBUG)&lt;信息(INFO)&lt;警告(WARN)&lt;错误(ERROR)&lt;致命错误(FATAL)<br>&nbsp;&nbsp;&nbsp; 3.怎么用？&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug() log.info() log.warn() log.error() log.fatal()依次对应上边的等级</p>
<p><br>四 log4j的配制</p>
<p>1.基本参数解释：<br>&nbsp;&nbsp;&nbsp; ⑴全局配制<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.rootLogger = [ level ] , appenderName, appenderName,..........appenderName<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★log4j.rootLogger的意思可以理解为：根log或者所有的log<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★level就是输出级别，只能设置一个值。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;关于等级，前边已经说过了有5种，他们之间的关系可以理解为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调试(DEBUG)：包含调试(DEBUG)、信息(INFO)、警告(WARN)、错误(ERROR)、致命错误(FATAL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信息(INFO)：包含信息(INFO)、警告(WARN)、错误(ERROR)、致命错误(FATAL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 警告(WARN)：包含警告(WARN)、错误(ERROR)、致命错误(FATAL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 错误(ERROR)：包含错误(ERROR)、致命错误(FATAL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 致命错误(FATAL)：只有他自己<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样，如果log4j.rootLogger = INFO，那么 INFO，WARN，ERROR，FATAL就全部会被输出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果log4j.rootLogger = ERROR，那么ERROR，FATAL就全部会被输出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★appenderName就是记录的目标,目标可以多个，中间用『,』分割，appenderName是自己定义的，换句话说，名字是随便起的，起了名之后，就需要在下边设定具体配制<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结一下这部分，比如说有这么一句log4j.rootLogger = INFO , F1,F2那么就以为着要将所有INFO，WARN，ERROR，FATAL的log全部输出到F1，F2上。F1，F2是什么？往下看。。。。<br>&nbsp;&nbsp;&nbsp; ⑵具体配制<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.F1=org.apache.log4j.ConsoleAppender<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.F1.layout=org.apache.log4j.PatternLayout <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★log4j.appender.F1=org.apache.log4j.ConsoleAppender的意思就是：将F1设置为控制台输出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;还可以设置成什么？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.ConsoleAppender（控制台），<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.FileAppender（文件），<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★log4j.appender.F1.layout=org.apache.log4j.PatternLayout的意思就是：将F1的输出布局设置为自定义输出布局。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;还可以设置成什么？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.HTMLLayout（以HTML表格形式布局）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.xml.XMLLayout（以XML形式布局）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n既然上边定义的是自定义输出布局，那么就要定义一下具体输出什么样了~~上边的%c %p %m 等以%开头的都是模式字符串，除了模式字符串外[]-空格等这些字符会按照原样显示。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;模式字符串解释：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %m:消息本身<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %p:消息的级别INFO，WARN，ERROR。。。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %r:从程序开始执行到当前日志产生时的时间间隔（微秒）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %c:输出当前日志动作所在的category名称。例如：如果category名称是"a.b.c","%c{2}"将会输出"b.c". {2}意谓着输出&#8220;以点分隔开的category名称的后两个组件&#8221;,如果 {n}没有，将会输出整个category名称.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %t:输出当前线程的名称<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %x:输出和当前线程相关联的NDC,尤其用到像java servlets这样的多客户多线程的应用中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %n:输出平台相关的换行符。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %%:输出一个"%"字符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %d:输出日志产生时候的日期，当然可以对日期的格式进行定制。例如：%d{HH:mm:ss,SSSS}或者是%d{dd MMM yyyy HH:mm:ss,SSSS},如果没有指定后面的格式，将会输出ISO8601的格式。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %l:输出位置信息，相当于%C.%M(%F:%L)的组合。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %C:输出日志消息产生时所在的类名，如果类名是&#8220;test.page.Class1&#8221;%C{1}表示输出类名"Class1",%C{2}输出"page.Class1",而%C则输出"test.page.Class1"。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %M:输出日志消息产生时的方法名称<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %F:输出日志消息产生时所在的文件名称<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %L:输出代码中的行号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)%20c：指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，默认的情况下右对齐。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)%-20c:指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，"-"号指定左对齐。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)%.30c:指定输出category的名称，最大的宽度是30，如果category的名称大于30的话，就会将左边多出的字符截掉，但小于30的话也不会有空格。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4)%20.30c:如果category的名称小于20就补空格，并且右对齐，如果其名称长于30字符，就从左边交远销出的字符截掉。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结一下，现在来我们所配制的F1的全部内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;我们把它配制成了屏幕输出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;输出的布局为：自定义布局<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;我们又定义了自定义布局的格式：日期时间（格式为：yyyy-MM-dd HH:mm:ss,SSS）[产生该日志的包名类名方法名] [等级] 信息+回车<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果想配制F2为每天产生一个日志文件，并且保存为xml，就这么写：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样就可以了吗？当然不是，既然保存为文件。。至少要指定一个文件名吧<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.F2.File=c:/logs/log.xml<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以了吗？可以运行了。。。但是。。既然每天都产生一个文件，那么前一天的怎么办呢？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.F2.DatePattern=yyyyMMdd'.xml.back'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样log4j会在第一次产生今天的log的同时，将昨天的log备份为 log文件名.扩展名yyyyMMdd.xml.back。对应我们这个文件，今天的log到明天有新log产生的时候，就会变为log.xml20070420.xml.back<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样的参数到底有多少？常用的有：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★ConsoleAppender选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;Threshold=WARN:指定日志消息的输出最低层次。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;Target=System.err：默认情况下是：System.out,指定输出控制台<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★FileAppender 选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;Threshold=WARN:指定日志消息的输出最低层次。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;File=mylog.txt:指定消息输出到mylog.txt文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★RollingFileAppender 选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;Threshold=WARN:指定日志消息的输出最低层次。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;File=mylog.txt:指定消息输出到mylog.txt文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时，将会自动滚动，即将原来的内容移到mylog.log.1文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;MaxBackupIndex=2:指定可以产生的滚动文件的最大数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★DailyRollingFileAppender 选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;Threshold=WARN:指定日志消息的输出最低层次。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;File=mylog.txt:指定消息输出到mylog.txt文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;DatePattern='.'yyyy-ww:每周滚动一次文件，即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)'.'yyyy-MM: 每月<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)'.'yyyy-ww: 每周<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)'.'yyyy-MM-dd: 每天<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4)'.'yyyy-MM-dd-a: 每天两次<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5)'.'yyyy-MM-dd-HH: 每小时<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6)'.'yyyy-MM-dd-HH-mm: 每分钟<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★PatternLayout 选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;ConversionPattern=%m%n :指定怎样格式化指定的消息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★HTMLLayout 选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;LocationInfo=true:默认值是false,输出java文件名称和行号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;Title=my app file: 默认值是 Log4J Log Messages.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ★XMLLayout 选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;LocationInfo=true:默认值是false,输出java文件和行号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在来看一下我们完整的第一个配制文件：<br>========================================================================================<br>log4j.rootLogger = INFO,F1,F2</p>
<p>log4j.appender.F1=org.apache.log4j.ConsoleAppender <br>log4j.appender.Threshold=DEBUG <br>log4j.appender.F1.Target=System.out <br>log4j.appender.F1.layout=org.apache.log4j.PatternLayout <br>log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n</p>
<p>log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender <br>log4j.appender.F2.File=c:/logs/log.xml<br>log4j.appender.F2.DatePattern=yyyyMMdd-HH'.xml.back' <br>log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout<br>========================================================================================<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编段代码看看效果<br>========================================================================================<br>import org.apache.commons.logging.Log;<br>import org.apache.commons.logging.LogFactory;<br>public class Main{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static Log log = LogFactory.getLog(Main.class);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info("info");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("debug");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.warn("warn");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error("error");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}<br>========================================================================================<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行效果<br>========================================================================================<br>2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[INFO] info<br>2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[WARN] warn<br>2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[ERROR] error<br>========================================================================================<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并且在c:/logs/下有log.xml生成，里边的内容为：<br>========================================================================================<br>&lt;log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="INFO" thread="main"&gt;<br>&lt;log4j:message&gt;&lt;![CDATA[info]]&gt;&lt;/log4j:message&gt;<br>&lt;/log4j:event&gt;</p>
<p>&lt;log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="WARN" thread="main"&gt;<br>&lt;log4j:message&gt;&lt;![CDATA[warn]]&gt;&lt;/log4j:message&gt;<br>&lt;/log4j:event&gt;</p>
<p>&lt;log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="ERROR" thread="main"&gt;<br>&lt;log4j:message&gt;&lt;![CDATA[error]]&gt;&lt;/log4j:message&gt;<br>&lt;/log4j:event&gt;<br>========================================================================================<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仔细看一下会发现，虽然我们在代码里写了log.debug("debug")但是debug并没有出现在log中，这是因为我们配置文件中，定义了log的等级为INFO，debug的等级小于info，所以不会显示，而warn，error的大于info，所以也会被显示出来</p>
<p><br>2.根据package生成不同的log文件<br>&nbsp;&nbsp;&nbsp; ⑴配置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.logger.cn.yyun.test.abc=INFO,abc2,abc1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.abc2=org.apache.log4j.ConsoleAppender <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.abc2.layout=org.apache.log4j.PatternLayout <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.abc2.layout.ConversionPattern=abc:[%p] %m%n</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.abc1=org.apache.log4j.DailyRollingFileAppender<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.abc1.File=C:/logs/abc.log<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.abc1.DatePattern='.'yyyyMMdd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.abc1.layout=org.apache.log4j.PatternLayout<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.abc1.layout.ConversionPattern=%d %r [%t] %5p - %m%n</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.logger.cn.yyun.test.def=INFO,def<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.def=org.apache.log4j.ConsoleAppender <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.def.layout=org.apache.log4j.PatternLayout <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.def.layout.ConversionPattern=def: [%p] %m%n</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把logger.cn.yyun.test.abc换成需要的package就可以了（整个log4j配制文件中只有这些就可以了 ）。但是这样会有另一个问题，如果cn.yyun.test.Main这个类中，如果有log操作，会报告：log4j:WARN No appenders could be found for logger (cn.yyun.test.Main).所以要加上log4j.rootCategory=INFO,F1&nbsp;&nbsp;&nbsp; 这样所有的log都会被纪录了。。但是这样又做之后：cn.yyun.test.def里的log，会同时出现在def和F1中，cn.yyun.test.abc里的log，会同时出现在abc1，abc2和F1中。。。。。所以定义的时候一定要规划好。<br>&nbsp;&nbsp;&nbsp; ⑵制定package的log等级<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.logger.org.hibernate=DEBUG<br></p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 19:04 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j使用示例</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136489.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 11:03:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136489.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136489.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136489.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136489.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #ffff00 1px solid; PADDING-RIGHT: 20px; BORDER-TOP: #ffff00 1px solid; PADDING-LEFT: 20px; PADDING-BOTTOM: 20px; MARGIN: 5px 10px 10px; BORDER-LEFT: #ffff00 1px solid; PADDING-TOP: 20px; BORDER-BOTTOM: #ffff00 1px solid; BACKGROUND-COLOR: #ffffcc"><br>log4j使用示例<br>--byblues(zhaochaohua@sina.com)<br>PART1介绍<br>log4j的好处在于：<br>1.通过修改配置文件，就可以决定log信息输出到何处(console,文件,...),是否输出。<br>这样，在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(System.out.println(...)等)。<br>2.使用log4j，需要整个系统有一个统一的log机制，有利于系统的规划。<br><br>log4j的使用本身很简单。但合理地规划一个系统的统一log机制需要周全的考虑。<br><br>其他关于log4j的信息参看log4j自带的文档。<br><br>PARTII配置文件详细解释<br>先看一个配置文件的例子:<br>1.配置文件的例子<br>log4j.rootLogger=DEBUG<br>#将DAO层log记录到DAOLog,allLog中<br>log4j.logger.DAO=DEBUG,A2,A4<br>#将逻辑层log记录到BusinessLog,allLog中<br>log4j.logger.Businesslog=DEBUG,A3,A4<br>#A1--打印到屏幕上<br>log4j.appender.A1=org.apache.log4j.ConsoleAppender<br>log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br>log4j.appender.A1.layout.ConversionPattern=%-5p[%t]%37c%3x-%m%n<br>#A2--打印到文件DAOLog中--专门为DAO层服务<br>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<br>log4j.appender.A2.file=DAOLog<br>log4j.appender.A2.DatePattern='.'yyyy-MM-dd<br>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br>log4j.appender.A2.layout.ConversionPattern=[%-5p]%d{yyyy-MM-ddHH:mm:ss,SSS}method:%l%n%m%n<br><br>#A3--打印到文件BusinessLog中--专门记录逻辑处理层服务log信息<br>log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender<br>log4j.appender.A3.file=BusinessLog<br>log4j.appender.A3.DatePattern='.'yyyy-MM-dd<br>log4j.appender.A3.layout=org.apache.log4j.PatternLayout<br>log4j.appender.A3.layout.ConversionPattern=[%-5p]%d{yyyy-MM-ddHH:mm:ss,SSS}method:%l%n%m%n<br><br>#A4--打印到文件alllog中--记录所有log信息<br>log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender<br>log4j.appender.A4.file=alllog<br>log4j.appender.A4.DatePattern='.'yyyy-MM-dd<br>log4j.appender.A4.layout=org.apache.log4j.PatternLayout<br>log4j.appender.A4.layout.ConversionPattern=[%-5p]%d{yyyy-MM-ddHH:mm:ss,SSS}method:%l%n%m%n<br><br><br>2.Appender的使用<br>一个Appender代表log信息要写向的一个地方。log4j可使用的Appender有很多类型,这里只考虑3种:ConsoleAppender,FileAppender,DailyRollFileAppender<br>2.1ConsoleAppender<br>如果使用ConsoleAppender，那么log信息将写到Console。就是直接把信息打印到System.out上了。<br>2.2FileAppender<br>使用FileAppender，那么log信息将写到指定的文件中。这应该是比较经常使用到的情况。<br>相应地，在配置文件中应该指定log输出的文件名。如下配置指定了log文件名为demo.txt<br>log4j.appender.A2.File=demo.txt<br>注意将A2替换为具体配置中Appender的别名。<br>2.3DailyRollingAppender<br>使用FileAppender可以将log信息输出到文件中，但是如果文件太大了读起来就不方便了。这时就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息输出到按照日期来区分的文件中。如下配置文件就会每天产生一个log文件，每个log文件只记录当天的log信息：<br><br>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<br>log4j.appender.A2.file=demo<br>log4j.appender.A2.DatePattern='.'yyyy-MM-dd<br>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br>log4j.appender.A2.layout.ConversionPattern=%m%n<br><br>3.Layout的配置<br>Layout指定了log信息输出的样式。<br>详细信息请查看PatternLayout的javadoc。<br>例子1：显示日期和log信息<br>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br>log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss,SSS}%m%n<br>打印的信息是：<br>2002-11-1211:49:42,866SELECT*FROMRoleWHERE1=1orderbycreateDatedesc<br><br>例子2：显示日期，log发生地方和log信息<br>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br>log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss,SSS}%l"#"%m%n<br>2002-11-1211:51:46,313cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)"#"SELECT*FROMRoleWHERE1=1orderbycreateDatedesc<br><br>例子3：显示log级别,时间,调用方法,log信息<br>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br>log4j.appender.A2.layout.ConversionPattern=[%-5p]%d{yyyy-MM-ddHH:mm:ss,SSS}method:%l%n%m%n<br>log信息:<br>[DEBUG]2002-11-1212:00:57,376method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)<br>SELECT*FROMRoleWHERE1=1orderbycreateDatedesc<br><br>PART3log4j的使用<br>log4j使用步骤有3个：<br>3.1.根据配置文件初始化log4j<br>配置文件如PART2所叙述。现在讲的是如何在程序中配置log4j。<br>log4j可以使用3中配置器来初始化：BasicConfigurator,DOMConfigurator,PropertyConfigurator<br>这里用的是PropertyConfigurator。使用PropertyConfigurator适用于所有的系统。<br>如下的语句<br>PropertyConfigurator.configure("log4j.properties");<br>就以log4j.properties为配置文件初始化好了log4j环境。<br>注意一点：这个语句只需要在系统启动的时候执行一次。例如:在unetwebOA项目中可以这么用:<br>在ActionServlet的init()方法中调用一次。<br>publicclassActionServletextendsHttpServlet{<br>...<br>/**<br>*Initializeglobalvariables<br>*/<br>publicvoidinit()throwsServletException{<br>//初始化Action资源<br>try{<br>initLog4j();<br>...<br>}catch(IOExceptione){<br>thrownewServletException("LoadActionResisError");<br>}<br>}<br>...<br>protectedvoidinitLog4j(){<br>PropertyConfigurator.configure("log4j.properties");<br>}<br>...<br>}//endclassActionServlet<br><br>3.2在需要使用log4j的地方获取Logger实例<br>如下是RoleDAO类中的使用例子:<br>staticLoggerlog=Logger.getLogger("DAO");<br>注意这里使用"DAO"标识符，那么对应的在配置文件中对应的配置信息如下：<br><br>#定义DAOLogger<br>log4j.logger.DAO=DEBUG,A2<br>#设置AppenderA2的属性<br>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<br>log4j.appender.A2.file=demo<br>log4j.appender.A2.DatePattern='.'yyyy-MM-dd<br>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br>log4j.appender.A2.layout.ConversionPattern=%-5p%d{yyyy-MM-ddHH:mm:ss}%l%n%m%n<br><br>publicclassRoleDAOextendsBaseDBObject<br>{<br>...<br>staticLoggerlog=Logger.getLogger("DAO");<br>...<br>publicBeanCollectionselectAll()throwsSQLException<br>{<br>StringBuffersql=newStringBuffer(SQLBUF_LEN);<br>sql.append("SELECT*FROM"+tableName+"orderbyroldId");<br>//System.out.println(sql.toString());<br>log.debug(sql);<br>...<br>}<br>...<br>}<br><br>3.3使用Logger对象的debug,info,fatal...方法<br>log.debug("itisthedebuginfo");<br><br>附件1：log4j的一个bug<br>当这样使用时，DailyRollingFileAppender不能正确使用：<br>publicClassRoleDAO(){<br><br>staticLoggerlog=Logger.getLogger("DAO");<br><br>//在每一次newRoleDAO对象的时候都执行一次configure()操作<br>publicRoleDAO(TransactionManagertransMgr)throwsSQLException<br>{<br>...<br>PropertyConfigurator.configure("log4j.properties");<br>...<br>}<br><br>publicvoidselect(){<br>...<br>//使用log4j进行log记录<br>log.debug("...");<br>...<br>}<br>}<br>怎么解决:<br>在系统启动时执行一次PropertyConfigurator.configure("log4j.properties");<br>之后就不再执行。</div>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 19:03 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j 例子</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136488.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136488.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136488.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136488.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">(A)Log4j 的组成</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">1.Logger 负责 生成日志</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">2.Appender 定义输出的地点和文件的属性</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">3.Layout 定义了输出的格式等</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt"></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">(B)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">Log4j有5种级别</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">FATAL,ERROR,WARN,INFO,DEBUG(从高到低)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt"></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">(C)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">方法有<span></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">fatal(Object message)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">error(...)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">warn(...)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">info(...)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">debug(...)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log(Priority p, Object message) &lt;参数1级别，2信息&gt;只有大于等于他在文件中定义的级别的信息才会被输出</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt"></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">(D)Appender组件</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">1.Console(控制台)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">2.File(文件)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">3.GUI(GUI Component)</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">4.套接口服务器</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">5.NT的事件记录器</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">6.UNIX Syslog守护进程</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt"></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">7.例子</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">/*************************</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.logger.testLogger = WARN,file,console</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.appender.file = org.apache.log4j.RollingFileAppender</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.appender.file.File = C:/log.txt</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.appender.console = org.apache.log4j.ConsoleAppender</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">**************************/</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">8.具体Page258</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt"></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">参考<span></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">##LOGGERS##</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">#configure root logger</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.rootLogger = INFO,console<span style="mso-spacerun: yes">&nbsp;&nbsp;</span><span style="COLOR: red">#根定义了INFO级别，输出是控制台</span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">#define a logger named helloAppLogger</span></p>
<p class=MsoNormal style="MARGIN: 0cm -86.3pt 0pt 0cm"><span style="FONT-SIZE: 10pt">log4j.logger.helloappLogger=WARN,file <span style="COLOR: red">#定义了一个helloappLogger继承了rootLogger，级别为WARN，并且因为继承了rootLogger,所以输出为file 和 console(除非把子类的additivity 改为false</span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">#define a second logger that is a child to helloAppLogger</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.logger.helloappLogger.childLogger=,file</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">##APPENDERS##</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">#define an appender named console ,which is set to be a ConsoleAppender</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.appender.console=org.apache.log4j.ConsoleAppender</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">#define an appender named file, which is set to be a RollingFileAppender</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.appender.file=org.apache.log4j.RollingFileAppender</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.appender.file.File=c:/logHello.html</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">#define a simpleLaout to console appender</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.appender.file.layout=org.apache.log4j.HTMLLayout</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10pt">log4j.appender.console.layout=org.apache.log4j.PatternLayout</span></p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 19:02 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>