﻿<?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-I will be back!-随笔分类-Log4j</title><link>http://www.blogjava.net/super2/category/21698.html</link><description>这么长的时间,我看到了事实</description><language>zh-cn</language><lastBuildDate>Tue, 17 Apr 2007 21:13:17 GMT</lastBuildDate><pubDate>Tue, 17 Apr 2007 21:13:17 GMT</pubDate><ttl>60</ttl><item><title>用Log4j自动生成日志[转]</title><link>http://www.blogjava.net/super2/archive/2007/04/17/Log4j.html</link><dc:creator>淘声依旧</dc:creator><author>淘声依旧</author><pubDate>Tue, 17 Apr 2007 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/super2/archive/2007/04/17/Log4j.html</guid><wfw:comment>http://www.blogjava.net/super2/comments/111344.html</wfw:comment><comments>http://www.blogjava.net/super2/archive/2007/04/17/Log4j.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super2/comments/commentRss/111344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super2/services/trackbacks/111344.html</trackback:ping><description><![CDATA[&nbsp;Log4j是Apache基金会的一个项目,它能为Java开发着提供功能强大使用方便的各种日志处理.当然它的版本不限于Java,还有C/C++等主流语言.我觉得它就象一把非常实用的锋利小刀,让我们的写程序时更加如鱼得水.
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4j输出的信息分如下几类:ALL,DEBUG,INFO,ERROR,FATAL,级别从低到高,输出的内容是从多到少.从字面意思即可看出大概,ALL指输出所有信息；DEBUG指调试信息；INFO指一般信息；ERROR指错误信息；FATAL指致命的错误信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出的信息级别和内容我们可以在程序里面设置，但缺点就不够灵活，并且无法在程序运行期间进行参数调整。通过XML或Property配置文件可以在外部控制Logger的输出，原理都一样的，只是表现形式不一样，看个人的习惯了。下面主要讲一下如何使用Property文件来灵活配置Log4j的输出。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Log4j中你可以让信息输出到控制台（Console）、文件、远程数据数等中的其中一个或多个当中。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先我们要先声明信息输出的级别，并且 为了能把信息输出到指定的目的地，我们要指定输出方案，如下所示：</p>
<p>&nbsp;&nbsp;&nbsp; log4j.rootLogger = DEBUG, A1,A4</p>
<p>&nbsp;&nbsp; DEBUG为输出信息的级别，A1,A4分别为输出方案的名称，下面我们来定义方案的具体参数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;指定该输出方案的信息输出目的地为控制台：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A1 = org.apache.log4j.ConsoleAppender</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 设定输出的布局为模式布局：<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A1.layout = org.apache.log4j.PatternLayout</p>
<p>&nbsp;&nbsp;&nbsp; 指定模式的具体参数：<br>&nbsp;&nbsp;&nbsp; log4j.appender.A1.layout.ConversionPattern =[%d{HH:mm:ss}] [%t] %-5p - %m %n</p>
<p>&nbsp;&nbsp;&nbsp; 每个参数前要加％来说明，其中：</p>
<p>&nbsp;&nbsp;&nbsp; %d：日期（date），如：yyyy-MM-dd,yyyy-MM-dd HH:mm:ss等</p>
<p>&nbsp;&nbsp;&nbsp; %t：线程名称（Thread）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; %-5p：信息优先级（Priority），宽度为5，左对齐。如DEBUG，FATAL等</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %m：输出信息（Message）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %n：回车换行</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还有其它几个象％c，％C，％F等</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 上面的方案A1指的是把信息输出到控制台，并且输出的格式按指定的格式输出。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们还可以指定把信息输出到文件当中，如下为普通文件输出方案：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A2 = org.apache.log4j.RollingFileAppender<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A2.File = logs\\test.log<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A2.MaxFileSize = 1MB<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A2.MaxBackupIndex = 3<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A2.layout = org.apache.log4j.PatternLayout<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A2.layout.ConversionPattern =[%d] %-4r [%t] %-5p %c %x - %m %n</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 输出指定的文件test.log当中，并且指定该文件最大不超过1MB，超过之后将清除后再写入。当然也可以直接用FileAppender，不进行Rolling，那么所以的日志信息都将追加到原信息的后面。MaxBackupIndex指的是最大备份数目。以上面文件为例，当test.log到达1MB，则它直接被修改成test.log.1，如果这个文件已存在，则修改为test.log.2，直到MaxBackupIndex。新的日志信息，将重新生成文件test.log。当下一次达到1MB时，此时test.log.1,test.log.2,test.log.3都已存在，则直接把test.log.3删除，把test.log修改成test.log.3。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把信息输出到远程数据库当中：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; # 定义A3输出到数据库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A3 = org.apache.log4j.jdbc.JDBCAppender<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A3.BufferSize = 40<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A3.Driver = sun.jdbc.odbc.JdbcOdbcDriver<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A3.URL = jdbc:ODBC:driver={Microsoft Access Driver (*.mdb)};DBQ=MobileDB.mdb<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A3.User =&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A3.Password =&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A3.layout = org.apache.log4j.PatternLayout<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A3.layout.ConversionPattern = INSERT INTO log4j(createDate, thread, priority, category, message) values('%d', '%t', '%-5p', '%c', '%m')</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 指定输出方案为JDBCAppender，即能过JDBC把日志自动写入到远程数据库当中。BufferSize指定缓冲区的大小，当输出内容达到缓冲区的大小时，就把数据写入数据库一次。下面的参数依次为指暄数据库驱动名称、数据库URL地址、数据库登录用户名和密码，模式布局和Select语句。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 我们也可以把信息输出到HTML文件当中，并且是按时间段自动生成文件，比如，每隔一个小时或一天、半天生成一个HTML文件：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A4 = org.apache.log4j.DailyRollingFileAppender<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A4.File = logs\\log.html<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A4.DatePattern='.'yyyy-MM-dd-HH'.html'<br>&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.A4.layout = org.apache.log4j.HTMLLayout </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第一个参数为指定输出方案为按日期滚动的文件方案。第二个参数指定文件名，第三个指定日期模式，最后一个指定布局为HTML布局。上面的设置会每隔一个小时产生一个HTML文件名，文件名为：log.html.2006-03-24-08.html的样子。<br>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 完整的配置文件log4j.properties如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.rootLogger = DEBUG, A1,A4</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A1 = org.apache.log4j.ConsoleAppender<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A1.layout = org.apache.log4j.PatternLayout<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A1.layout.ConversionPattern =[%d{HH:mm:ss}] [%t] %-5p - %m %n</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A2 = org.apache.log4j.RollingFileAppender<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A2.File = logs\\test.log<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A2.MaxFileSize = 1KB<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A2.MaxBackupIndex = 3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A2.layout = org.apache.log4j.PatternLayout<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A2.layout.ConversionPattern =[%d] %-4r [%t] %-5p %c %x - %m %n</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#11区 定义A3输出到数据库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A3 = org.apache.log4j.jdbc.JDBCAppender<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A3.BufferSize = 40<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A3.Driver = sun.jdbc.odbc.JdbcOdbcDriver<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A3.URL = jdbc:ODBC:driver={Microsoft Access Driver (*.mdb)};DBQ=MobileDB.mdb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A3.User =&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A3.Password =&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A3.layout = org.apache.log4j.PatternLayout<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A3.layout.ConversionPattern = INSERT INTO log4j(createDate, thread, priority, category, message) values('%d', '%t', '%-5p', '%c', '%m')</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A4 = org.apache.log4j.DailyRollingFileAppender<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A4.File = logs\\log.html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A4.DatePattern='.'yyyy-MM-dd-HH'.html'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A4.layout = org.apache.log4j.HTMLLayout </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在程序里面只需声明使用Property配置文件来控制输出就行了，如下所示：</p>
<p>&nbsp;&nbsp;&nbsp; static Logger logger = Logger.getLogger(DHMain.class);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropertyConfigurator.configure("conf\\log4j.properties");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;logger.debug("启动..." );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; 有了Log4j，我们完全可以抛弃System.out了，用它吃力又不讨好，何苦呢？</p>
<img src ="http://www.blogjava.net/super2/aggbug/111344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super2/" target="_blank">淘声依旧</a> 2007-04-17 16:40 <a href="http://www.blogjava.net/super2/archive/2007/04/17/Log4j.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>