﻿<?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-自然-文章分类-Log</title><link>http://www.blogjava.net/masen/category/20938.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 21 Mar 2015 14:04:20 GMT</lastBuildDate><pubDate>Sat, 21 Mar 2015 14:04:20 GMT</pubDate><ttl>60</ttl><item><title>slf4j_logback(转)</title><link>http://www.blogjava.net/masen/articles/423642.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Thu, 19 Mar 2015 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/423642.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/423642.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/423642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/423642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/423642.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;转载&nbsp;http://feitianbenyue.iteye.com/blog/1882887背景:&nbsp;&nbsp;&nbsp;一直以来,项目都是使用log4j+slf4j的方案来做日志,&nbsp;最近看到&nbsp;logback的文章,优点多多,手痒不已注:阅读此文,需要有一定的log&nbsp;日志基础&nbsp;logback介绍:&nbsp;首先logbac...&nbsp;&nbsp;<a href='http://www.blogjava.net/masen/articles/423642.html'>阅读全文</a><img src ="http://www.blogjava.net/masen/aggbug/423642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2015-03-19 20:39 <a href="http://www.blogjava.net/masen/articles/423642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>slf4j(转)</title><link>http://www.blogjava.net/masen/articles/423618.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Thu, 19 Mar 2015 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/423618.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/423618.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/423618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/423618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/423618.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.1999988555908px; background-color: #ffffff;"><span style="font-size: small;"><strong>Slf4j&nbsp;</strong>:&nbsp;</span><span style="font-size: small;">全称为Simple Logging Facade for JAVA：java简单日志门面。&nbsp;</span><span style="font-size: small;">是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging&nbsp;应该有一样的初衷。个人感觉设从计上更好一些，没有commons&nbsp;那么多潜规则。同时有两个额外特点：</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.1999988555908px; background-color: #ffffff;"><span style="font-size: small;">1.&nbsp;能支持多个参数，并通过{}&nbsp;占位符进行替换，避免老写logger.isXXXEnabled&nbsp;这种无奈的判断，带来性能提升见：http://www.slf4j.org/faq.html#logging_performance&nbsp;。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.1999988555908px; background-color: #ffffff;"><span style="font-size: small;">2.OSGI&nbsp;机制更好兼容支持</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.1999988555908px; background-color: #ffffff;">一图胜千言，官网上的一个图：</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.1999988555908px; background-color: #ffffff;"><br /><img alt="" width="513" src="http://dl.iteye.com/upload/attachment/426780/0c184c55-5f4f-305d-b019-04ce68389fd6.png" height="697" style="border: 0px;" /><br /><br /><br /></p><ol start="1" class="dp-xml" style="padding: 0px; border: none; list-style-position: initial; list-style-image: initial; color: #5c5c5c; font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; line-height: 26px; margin: 0px 0px 1px 45px !important; background-color: #ffffff;"><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: #6ce26c; list-style: decimal-leading-zero outside; color: inherit; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;"><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&lt;</span><span class="tag-name" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">dependency</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&gt;</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;&nbsp;</span></span></li><li class="" style="border-style: none none none solid; border-left-width: 3px; border-left-color: #6ce26c; list-style: decimal-leading-zero outside; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: #f8f8f8;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&lt;</span><span class="tag-name" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">groupId</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&gt;</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">org.slf4j</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&lt;/</span><span class="tag-name" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">groupId</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&gt;</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;&nbsp;</span></span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: #6ce26c; list-style: decimal-leading-zero outside; color: inherit; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&lt;</span><span class="tag-name" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">artifactId</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&gt;</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">slf4j-log4j12</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&lt;/</span><span class="tag-name" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">artifactId</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&gt;</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;&nbsp;</span></span></li><li class="" style="border-style: none none none solid; border-left-width: 3px; border-left-color: #6ce26c; list-style: decimal-leading-zero outside; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-color: #f8f8f8;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&lt;</span><span class="tag-name" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">version</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&gt;</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">1.7.2</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&lt;/</span><span class="tag-name" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">version</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&gt;</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;&nbsp;</span></span></li><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: #6ce26c; list-style: decimal-leading-zero outside; color: inherit; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;"><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&lt;/</span><span class="tag-name" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">dependency</span><span class="tag" style="margin: 0px; padding: 0px; border: none; color: #993300; font-weight: bold; background-color: inherit;">&gt;</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;&nbsp;</span></span></li></ol><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.1999988555908px; background-color: #ffffff;"><br /></p><img src ="http://www.blogjava.net/masen/aggbug/423618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2015-03-19 14:12 <a href="http://www.blogjava.net/masen/articles/423618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用输出格式 %c   类全名</title><link>http://www.blogjava.net/masen/articles/202174.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Thu, 22 May 2008 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/202174.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/202174.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/202174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/202174.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/202174.html</trackback:ping><description><![CDATA[<div id="art" style="margin: 15px" width="100%">
<p>常用输出格式</p>
<p>%c&nbsp;&nbsp; 列出logger名字空间的全称，如加上{&lt;层数&gt;}表示出从最内层算起的指定层数的名字空间<br />
%X&nbsp; 按MDC（Mapped Diagnostic Context,线程映射表）输出日志。通常用于多个客户端连接同一台服务器，方便服务器区分是那个客户端访问留下来的日志。<br />
%p&nbsp; 日志信息级别<br />
%d&nbsp;&nbsp; %d{&lt;日期格式&gt;}:日志信息产生时间,使用ISO8601定义的日期格式<br />
%C&nbsp;&nbsp; 日志信息所在地（全限类名）<br />
%m&nbsp;&nbsp; 产生的日志具体信息<br />
%n&nbsp;&nbsp;&nbsp; 输出日志信息换行<br />
%F　显示调用logger的源文件名<br />
%l&nbsp;&nbsp;&nbsp;&nbsp; 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数<br />
%L&nbsp;&nbsp;&nbsp; 显示调用logger的代码行<br />
%M&nbsp;&nbsp; 显示调用logger的方法名<br />
%r&nbsp;&nbsp;&nbsp;&nbsp; 显示从程序启动时到记录该条日志时已经经过的毫秒数<br />
%t&nbsp;&nbsp;&nbsp;&nbsp; 输出产生该日志事件的线程名<br />
%%　显示一个</p>
<p><br />
<br />
<br />
获取logger<br />
Logger.getRootLogger()&nbsp;&nbsp;获取根logger<br />
Logger.getLogger(String name)获取子logger<br />
Logger.getLogger(Class clazz)或<br />
Logger.getLogger(clazz.getName())</p>
<p>设置日志级别(.setLevel(int,Exception))<br />
Level.ALL打开所有日志<br />
Level.DEBUG 用于调试<br />
Level.INFO 用于运行过程<br />
Level.WARN 用于潜在的错误<br />
Level.ERROR 用于错误事件<br />
Level.FATAL 用于严重错误时间<br />
Level.OFF 关闭所有日志</p>
<p>输出端Appender(.addAppender(Appender).setAdditivity(boolean additive)是否覆盖)<br />
org.apache.log4j.ConsoleAppender&nbsp;&nbsp;输出到控制台<br />
&nbsp;targer:<br />
&nbsp;&nbsp;ConsoleAppender.SYSTEM_OUT(Default)<br />
&nbsp;&nbsp;ConsoleAppender.SYSTEM_ERR<br />
&nbsp;public ConsoleAppender(Layout)<br />
&nbsp;public ConsoleAppender(Layout,String targer)<br />
org.apache.log4j.FileAppender&nbsp;&nbsp;&nbsp;输出到文件<br />
&nbsp;public FileAppender(Layout,String fileName)<br />
&nbsp;public FileAppender(Layout,String fileName,boolean append)是否覆盖<br />
org.apache.log4j.DailyRollingFileAppender&nbsp;输出到文件,每天一个新文件<br />
org.apache.log4j.RollingFileAppender&nbsp;&nbsp;输出到文件,自动新增改名<br />
&nbsp;public RollingFileAppender(Layout,String fileName)<br />
&nbsp;void setMaxBackupIndex(int index)&nbsp;设置日志文件最大备份数<br />
&nbsp;void setMaximumFileSize(long size)&nbsp;设置日志文件最大尺寸<br />
org.apache.log4j.WriterAppender&nbsp;&nbsp;流格式输出到任意地方<br />
org.apache.log4j.JDBCAppender&nbsp;&nbsp;输出到数据库</p>
<p>日志格式化(Layout)<br />
%c&nbsp;&nbsp;&nbsp;类全名<br />
%d&nbsp;&nbsp;&nbsp;时间<br />
%f&nbsp;&nbsp;&nbsp;类名<br />
%l&nbsp;&nbsp;&nbsp;位置<br />
%m&nbsp;&nbsp;&nbsp;信息<br />
%n&nbsp;&nbsp;&nbsp;换行<br />
%p&nbsp;&nbsp;&nbsp;级别<br />
%r&nbsp;&nbsp;&nbsp;耗时<br />
%t&nbsp;&nbsp;&nbsp;线程名</p>
<p>public PatternLayout()&nbsp;使用默认设置DEFAULT_CONVERSION_PATTERN&nbsp;只打印信息<br />
public PatternLayout(String)使用自定义的pattern构造一个PatternLayout<br />
void setConversionPattern(String) &nbsp;设置日志格式<br />
HTMLLayout<br />
SimpleLayout</p>
<p><br />
5.<br />
1.BasicConfigurator.configure()<br />
&nbsp;PatternLayout&nbsp;p = new PatternLayout("%p [%t] %c (%F:%L) - %m%n");&nbsp;&nbsp;<br />
&nbsp;ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT);&nbsp;<br />
&nbsp;root.addAppender(a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;rootLogger.setLevel(Level.DEBUG);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
2.PropertyConfigurator.configure("/help/example.properties")<br />
&nbsp;&nbsp;String resource = "/help/example.properties";<br />
&nbsp;&nbsp;URL configFileResource = Log4J.class.getResource(resource);<br />
&nbsp;&nbsp;PropertyConfigurator.configure(configFileResource);<br />
3.DOMConfigurator.configure("/help/example.xml")<br />
xml declaration and dtd <br />
| <br />
log4j:configuration <br />
| <br />
+-- appender (name, class) <br />
| | <br />
| +-- param (name, value) <br />
| +-- layout (class) <br />
| | <br />
| +-- param (name, value) <br />
+-- logger (name, additivity) <br />
| | <br />
| +-- level (class, value) <br />
| | | <br />
| | +-- param (name, value) <br />
| +-- appender-ref (ref) <br />
+-- root <br />
| <br />
+-- param (name, class) <br />
+-- level <br />
| | <br />
| +-- param (name, value) <br />
+-- appender-ref (ref) </p>
<p><br />
0.log4j.properties模板<br />
log4j.rootLogger=info,CONSOLE,RFILE,FILE,DB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置级别和三个输出端<br />
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender &nbsp;&nbsp;&nbsp;&nbsp;<br />
log4j.appender.CONSOLE.Target=System.out &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;控制台类型<br />
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout &nbsp;&nbsp;&nbsp;<br />
log4j.appender.CONSOLE.layout.ConversionPattern= %4p [%t] (%F:%L) - %m%n&nbsp;</p>
<p>log4j.appender.FILE=org.apache.log4j.FileAppender&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
log4j.appender.FILE.File=/help/my.properties&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目标文件<br />
log4j.appender.FILE.Append=false&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否追加<br />
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;布局模式<br />
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %c:%L - %m%n&nbsp; &nbsp;格式化布局</p>
<p>log4j.appender.RFILE=org.apache.log4j.RollingFileAppender&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
log4j.appender.RFILE.File=/help/my.properties&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目标文件<br />
log4j.appender.RFILE.MaxFileSize=1KB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大长度<br />
log4j.appender.RFILE.MaxBackupIndex=3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最多备份<br />
log4j.appender.RFILE.layout=org.apache.log4j.PatternLayout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;布局模式<br />
log4j.appender.RFILE.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %c:%L - %m%n&nbsp; &nbsp;格式化布局</p>
<p>log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
log4j.appender.DB.URL=jdbc:oracle:thin:@127.0.0.1:1521:mumu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL<br />
log4j.appender.DB.driver=oracle.jdbc.driver.OracleDriver&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;驱动<br />
log4j.appender.DB.user=liulibo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户名<br />
log4j.appender.DB.password=liulibo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;密码<br />
log4j.appender.DB.layout=org.apache.log4j.PatternLayout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;布局模式<br />
log4j.appender.DB.layout.ConversionPattern=insert into log4j(createdate,thread,level_,class,message) values(\'%d\',\'%t\',\'%-5p\',\'%c\',\'%m\')</p>
<p>create table log4j(createdate varchar2(32),thread varchar2(32),level_ varchar2(32),class varchar2(32),message varchar2(32));<br />
&nbsp;<br />
0.XML模板<br />
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;</p>
<p>&lt;log4j:configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&lt;appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"&gt;<br />
&nbsp;&nbsp;&lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n"/&gt;<br />
&nbsp;&nbsp;&lt;/layout&gt;<br />
&nbsp;&lt;/appender&gt;<br />
&nbsp; <br />
&nbsp;&lt;appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="Append" value="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="MaxFileSize" value="1KB"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="File" value="dom/my.log"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="MaxBackupIndex" value="3"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/layout&gt;<br />
&nbsp;&lt;/appender&gt;<br />
&nbsp;<br />
&nbsp;&lt;appender name="JDBCAppender" class="org.apache.log4j.jdbc.JDBCAppender"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="URL" value="jdbc:oracle:thin:@127.0.0.1:1521:mumu"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="user" value="liulibo"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="password" value="liulibo"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="driver" value="oracle.jdbc.driver.OracleDriver"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;param name="ConversionPattern" value="insert into log4j(createdate,thread,level_,class,message) values(\'%d\',\'%t\',\'%-5p\',\'%c\',\'%m\')"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/layout&gt;<br />
&nbsp;&lt;/appender&gt;<br />
&nbsp; <br />
&nbsp;&lt;root&gt;<br />
&nbsp;&nbsp;&lt;priority value ="debug" /&gt;<br />
&nbsp;&nbsp;&lt;appender-ref ref="ConsoleAppender"/&gt;<br />
&nbsp;&nbsp;&lt;appender-ref ref="RollingFileAppender"/&gt;<br />
&nbsp;&nbsp;&lt;appender-ref ref="JDBCAppender"/&gt;<br />
&nbsp;&lt;/root&gt;</p>
<p>&lt;/log4j:configuration&gt;</p>
<p>应用<br />
&nbsp;web.xml<br />
&nbsp;&nbsp;&lt;context-param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param-name&gt;props&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/log4j.properties&lt;/param-value&gt;<br />
&nbsp;&nbsp;&lt;/context-param&gt;<br />
&nbsp; <br />
&nbsp;&nbsp;&lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;listener-class&gt;cart.listener.SCServletContextListener&lt;/listener-class&gt;<br />
&nbsp;&nbsp;&lt;/listener&gt;<br />
&nbsp;初始化方法中添加<br />
&nbsp;private void initLog4j(ServletContext context){<br />
&nbsp;&nbsp; String prefix = context.getRealPath("/");<br />
&nbsp;&nbsp; System.out.println("prefix:"+prefix);<br />
&nbsp;&nbsp; String props = context.getInitParameter("props");<br />
&nbsp;&nbsp;if(props != null) {<br />
&nbsp;&nbsp;&nbsp;PropertyConfigurator.configure(prefix+props);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;Logger logger = Logger.getLogger(SCServletContextListener.class);&nbsp;<br />
&nbsp;&nbsp; }</p>
<div></div>
</div>
<img src ="http://www.blogjava.net/masen/aggbug/202174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2008-05-22 15:05 <a href="http://www.blogjava.net/masen/articles/202174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效地记录日志可以简化企业的开发过程</title><link>http://www.blogjava.net/masen/articles/202117.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Thu, 22 May 2008 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/202117.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/202117.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/202117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/202117.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/202117.html</trackback:ping><description><![CDATA[<div class="center">
<h4>摘要:</h4>
如果您是一名开发人员，那您很可能就已经具有这种经验：您已经开发了一些代码以及一些测试用例。应用程序经过了严格的 QA 测试，您确信代码可以完全适合业务的需求。然而，在将应用程序最终交付终端用户的手里时，却会出现一些预想不到的问题。如果没有适当的日志消息，可能需要花费几天的时间来诊断这些问题。不幸的是，大部分项目对于日志都没有一个清晰的策略。如果没有这种策略，系统产生的日志消息就有可能无益于问题的分析和解决。在本文中，我们将讨论企业应用程序日志的各个方面的问题。 </div>
<!-- end of summary line -->
<div class="overflow" id="text">在企业级的开发过程中，我们不可避免地会碰到很多问题；如果您希望在开发过程的后期能够有效地捕捉 bug，那就需要一种有效的日志策略。但是在一个企业的应用程序中要想实现有效地记录日志，需要进行一番规划，并设计一些准则。在本文中，顾问 Charles Chan 将向您介绍一些最好的实践，从而帮助您从项目一开始就编写有用的日志代码。<br />
<br />
如果您是一名开发人员，那您很可能就已经具有这种经验：您已经开发了一些代码以及一些测试用例。应用程序经过了严格的 QA 测试，您确信代码可以完全适合业务的需求。然而，在将应用程序最终交付终端用户的手里时，却会出现一些预想不到的问题。如果没有适当的日志消息，可能需要花费几天的时间来诊断这些问题。不幸的是，大部分项目对于日志都没有一个清晰的策略。如果没有这种策略，系统产生的日志消息就有可能无益于问题的分析和解决。在本文中，我们将讨论企业应用程序日志的各个方面的问题。您将看到一个 Java&#8482; 平台上日志 API 的概述，学习一些最好的编写日志代码的实践，并了解如果需要在产品环境中对详细日志重新进行排序，应该如何处理。<br />
<br />
<strong>选择日志 API</strong> <br />
<br />
在使用 Java 平台进行开发时，可以使用两个主要的日志 API：Apache Log4J 和 Java Logging API，在 1.4 及更高版本的 Java 平台中都提供了这两个 API。与 Java Logging API 相比，Log4J 更加成熟，特性也更加丰富。这两个日志的实现都采用了一个类似的设计模式（如图 1 所示）。除非您的公司限制要使用第三方的库，否则我强烈建议使用 Log4J。如果您不能决定使用哪个 API，就可以使用 Apache Commons Logging API，它对底层的日志实现进行了封装。从理论上来说，这样不用修改代码就可以进行日志实现的切换。然而，实际上您很少会切换日志的实现；因此，我不建议使用 Apache Commons Logging API，因为它的复杂性并不没有给您带来其他特性。<br />
<br />
<br />
<strong>日志概述</strong><br />
<br />
Log4J 和 Java Logging API 都采用了类似的设计和使用模式（如图 1 和清单 1 所示）。消息首先被创建，然后传递给一个具有特定优先权的日志对象。这些消息的目的和格式是由输出处理程序及其布局所决定。<br />
<br />
<br />
<br />
清单 1. 日志对象的实例化和使用<br />
<br />
<pre class="overflow">import org.apache.log4j.Logger;<br />
<br />
public class MyClass {<br />
&nbsp;&nbsp;/*<br />
&nbsp;&nbsp; * Obtain a logger for a message category. In this case, the message category is<br />
&nbsp;&nbsp; * the fully qualified class name of MyClass.<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;private static final Logger logger = Logger.getLogger(MyClass.class.getName());<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;public void myMethod() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (logger.isDebugEnabled()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug("Executing with parameters: " + param1 + ":" + param2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}</pre>
<br />
<br />
<br />
一个好的日志实现中提供了很多不同的输出处理程序，最常见的文件输出处理程序和终端输出处理程序。Log4J 还提供了一些处理程序将消息发布到一个 JMS 主题中，或者将消息插入一个数据库表中。尽管这编写一个定制的附加器并不困难，但是编写和维护这种代码的总体成本不应低估。消息的格式可以通过 Layout 对象进行配置。最常见的 layout 对象是 PatternLayout，它根据所提供的模式对消息进行格式化。<br />
<br />
清单 2 给出了一个 Log4J 的样例配置文件，它负责配置 FileAppender。在这种配置中，com.ambrosesoft.log.MyClass 类中的错误消息被发送给 FileAppender，后者将其写入一个名为 log.txt 的文件中。这些消息是根据与这个添加器相关的 layout（在这种情况中是 PatternLayout）进行格式化的。<br />
<br />
<br />
清单 2. Log4J XML 配置样例文件<br />
<pre class="overflow">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;<br />
<br />
&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;appender name="fileAppender" class="org.apache.log4j.FileAppender"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="File" value="log.txt"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="Append" value="true"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="ConversionPattern" value="%d [%t] %p - %m%n"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;<br />
&nbsp;&nbsp;&lt;/appender&gt;<br />
<br />
&nbsp;&nbsp;&lt;category name="com.ambrosesoft.log.MyClass"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;priority value="error"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender-ref ref="fileAppender"/&gt;<br />
&nbsp;&nbsp;&lt;/category&gt;<br />
<br />
&nbsp;&nbsp;&lt;root&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;priority value="debug"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender-ref ref="fileAppender"/&gt;<br />
&nbsp;&nbsp;&lt;/root&gt;<br />
<br />
&lt;/log4j:configuration&gt;</pre>
<br />
<br />
<br />
<strong>日志最佳实践</strong><br />
<br />
关于日志，您要做的一个最重要的选择可能是确定一种模式，将每个日志消息分配给一个特定的 类别。常见的一种实践是使用每个类的全名，这些类的操作会被作为一个消息类别在日志中记录（正如我们在清单 1 中看到的一样），这是因为这可以让开发人员更细粒度地记录每个类的设置。然而，这只有在使用日志消息来跟踪执行过程时才能良好地工作。在企业级的应用程序中，有很多其他类型的日志消息。举例来说，一条日志消息可能是为安全顾问产生的，而另外一条日志消息则可能是会为了帮助进行性能调优而产生的。如果这两条消息所关注的是同一个类，这样就会被分配给相同的类别，这将很难在日志输出结果中对其进行区分。<br />
<br />
为了避免这个问题，应用程序应该具有一组专用的日志记录程序，它们都进行了独特的分类，如清单 3 所示。每个日志记录程序都可以配置自己的优先级和输出处理程序。例如，安全性日志记录程序可以在将日志写入目的地之前对消息进行加密。有时应用程序的设计者应该与使用日志的用户（例如安全顾问）一起来商讨日志的输出格式，从而对这些消息进行更好的控制。<br />
<br />
<br />
清单 3. 专用的日志记录程序<br />
<br />
<pre class="overflow">import org.apache.log4j.Logger;<br />
<br />
public interface Loggers {<br />
&nbsp;&nbsp;Logger performance = Logger.getLogger("performance");<br />
&nbsp;&nbsp;Logger security = Logger.getLogger("security");<br />
&nbsp;&nbsp;Logger business = Logger.getLogger("business");<br />
}<br />
...<br />
public class MyClass {<br />
&nbsp;&nbsp;....<br />
&nbsp;&nbsp;if (Loggers.security.isWarnEnabled()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;Loggers.security.warn("Access denied: Username [" + userName + "] ...");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;...<br />
}</pre>
<br />
<br />
<br />
<strong>选择日志的级别</strong><br />
<br />
一个 类别 （例如 security）中的消息可以具有不同的 优先级。有些消息是为了调试而产生的，有些是为了警告而产生的，有些则是出现错误而产生的。消息的不同优先级可以通过记录 级别 来产生。最常用的日志级别有：<br />
<br />
Debug: 这个级别的消息中包含了非常广泛的上下文信息。通常用于问题诊断。<br />
<br />
Info: 这些消息包含了一些有助于在产品环境中（粒度较粗）帮助跟踪执行过程的上下文消息。<br />
<br />
Warning: 警告消息，说明系统中可能存在问题。例如，如果这个消息类别是有关安全性方面的，那么如果检测到字典攻击，就应该产生一条警告消息。<br />
<br />
Error: 错误消息说明系统中出现了严重的问题。这种问题通常都是不可恢复的，需要人工进行干预。<br />
标准的 Java Logging API 和 Apache Log4J 在此之外又提供了一些日志级别。日志级别的主要目标是帮助您过滤有用信息中的噪声。为了防止出现使用错误的级别以及降低日志消息的效用的情况，在开始编码之前，必须为开发人员提供一个清晰的指导方针。<br />
<br />
<strong>日志消息的格式</strong><br />
<br />
<span style="color: red">一旦选定日志记录程序并建立起日志级别之后，就可以开始构建日志消息了。在这样做时，重要的是要包含尽可能多的上下文信息，例如用户提供的参数，其他应用程序的状态信息。记录日志对象的一种方法是将它们转换成 XML。第三方库，例如 XStream（请参阅 参考资料）可以自动将 Java 对象转换成 XML 。尽管这是一种非常强大的机制，但是我们必须要考虑在速度与详细程度之间达到一种平衡。除了典型的应用程序状态信息之外，还应该记录以下信息：<br />
<br />
线程 ID: 企业级的应用程序通常都是在多线程的环境中运行的。使用线程 ID 信息，您就可以将多个请求区分开来。<br />
<br />
调用程序的标识: 调用程序的标识也是非常重要的信息。由于不同的用户具有不同的特权，它们的执行路径也可能会有很大的不同。将用户的标识放到日志消息中，这对于对安全性敏感的应用程序是非常大的一个帮助。<br />
<br />
时间戳: 通常来说，用户只能近似地知道问题发生的时间。如果没有时间戳，就很难让别人来判断问题的原因所在。<br />
<br />
源代码信息: 这包括类名、方法名和行号。除非您非常关注安全性，否则我建议您保留调试标记（-g），即使在编译产品时也是如此。如果没有调试标记，Java 编译器就会删除所有的行号信息，从而极大地减少日志消息的可用性。 <br />
上面这些信息（除了调用程序标识）都是由日志实现自动获取的。为了将这些信息包含到消息中，您只需要为输出处理程序配置一个适当的 layout 模式即可。要捕获调用者的标识，您可以利用 Log4J 中的诊断上下文特性（更多信息请参阅 参考资料）。诊断上下文让您可以将上下文信息与当前正在运行的线程关联在一起。这些信息可以在为输出进行格式化的同时而包含到每条消息中。<br />
<br />
在 J2EE Web 应用程序中，应用逻辑将用户标识保存到诊断上下文中最好的地方是在一个 servlet 过滤器中。清单 4 中显示了要实现这种功能的必要代码。它使用了 Log4J 1.3 alpha 中提供的映射诊断上下文类（MDC）。您可以使用 Log4J 1.2 中提供的嵌套诊断上下文（NDC）实现相同的功能。有关 servlet 过滤器的更多通用信息，请参阅 参考资料 中的信息。<br />
</span><br />
<br />
清单 4. 在 servlet 过滤器中使用诊断上下文<br />
<br />
<pre class="overflow">import javax.servlet.Filter;<br />
...<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpSession;<br />
import org.apache.log4j.MDC;<br />
<br />
public class LoggerFilter implements Filter {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void doFilter(ServletRequest request, ServletResponse response,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChain chain) throws IOException, ServletException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Retrieves the session object from the current request.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSession session = ((HttpServletRequest)request).getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Put the username into the diagnostic context.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Use %X{username} in the layout pattern to include this information.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDC.put("username", session.getAttribute("username"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Continue processing the rest of the filter chain.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(request, response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Remove the username from the diagnostic context.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDC.remove("username");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;...<br />
}</pre>
<br />
<br />
<br />
<strong>使用 AspectJ 跟踪执行情况</strong><br />
<br />
在对问题进行诊断时，通常跟踪程序的执行情况会很有帮助。您可以在程序执行的不同地方持续发送日志消息吗？例如方法的入口函数和出口函数。这是一个老问题，在出现 AspectJ 之前一直都没有什么好的解决方案。使用 AspectJ，可以在应用程序的不同地方执行代码段。在 AspectJ 中，这些地方都称为 point cut，在 point cut 处所执行的代码称为 advice。point cut 和advice 合称 aspect。<br />
<br />
关于 AspectJ，有一件事情非常神奇，aspect 不用很多努力就可以应用到整个应用程序中。有关 AspectJ 的更多信息，请参阅 参考资料。清单 5 给出了一个 AspectJ 源文件的例子，它用来对方法的入口和出口函数记录日志。在这个例子中，跟踪日志程序将在每次进入或退出 com.ambrosesoft 包的一个共有方法时都会记录一条日志。<br />
<br />
<br />
清单 5. 使用 AspectJ 记录方法的入口和出口<br />
<br />
<pre class="overflow">import org.apache.log4j.Logger;<br />
import java.lang.reflect.Field;<br />
<br />
public aspect AutoTrace {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private static final Logger logger = Logger.getLogger(AutoTrace.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;pointcut publicMethods() : execution(public * com.ambrosesoft..*(..));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;pointcut loggableCalls() : publicMethods();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Inspect the class and find its logger object. If none is found, use<br />
&nbsp;&nbsp;&nbsp;&nbsp; * the one defined here.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Logger getLogger(org.aspectj.lang.JoinPoint joinPoint) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Try to discover the logger object. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * The logger object must be a static field called logger.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class declaringType = joinPoint.getSignature().getDeclaringType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field loggerField = declaringType.getField("logger");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loggerField.setAccessible(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (Logger)loggerField.get(null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch(NoSuchFieldException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Cannot find a logger object, use the internal one.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return logger;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch(Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new RuntimeException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * An aspect to log method entry.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;before() : loggableCalls(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getLogger(thisJoinPoint).debug("Entering.." + thisJoinPoint.getSignature().toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * An aspect to log method exit.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;after() : loggableCalls(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getLogger(thisJoinPoint).debug("Exiting.." + thisJoinPoint.getSignature().toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
} </pre>
<br />
<br />
<br />
<strong>产品环境中的日志</strong><br />
<br />
一旦应用程序处于产品环境中之后，您通常都需要关闭调试或信息日志消息，从而对运行时的性能进行优化。然而，当有些不好的事情发生时，您又不能在开发环境中重现这个问题，那就可能需要在产品环境中激活调试消息了。重要的是能够修改日志的设置，而不用关闭服务器。诊断产品的问题即使不用花费数天来进行详细的调研，通常也需要几个小时的时间。在这段时间之内，开发人员需要激活或关闭应用程序不同范围的日志。如果每次修改日志的设置之后都需要重新启动产品应用程序，那么情况就会变得非常不可靠了。<br />
<br />
幸运的是，Log4J 提供了一种简单的机制来解决这个问题。在 Log4J 1.2 中，DOMConfigurator 中的 configureAndWatch() 方法会对 Log4J 进行配置，并自动监视日志配置文件中的变化。这在清单 6 中进行了阐述。（注意，在 Log4J 1.3（目前仍是 alpha 版本） 中并不推荐使用 DOMConfigurator，它使用了一个更加灵活的实现 JoranConfigurator。）<br />
<br />
为了确保 configureAndWatch() 是在 Log4J 初始化之前调用的，您应该在启动类中调用它。不同的应用程序服务器采用了不同的机制来执行启动代码（更多信息请参阅 参考资料）。详细信息请查看应用服务器的实现。有些应用服务器可能需要您将 Log4J 的库放到服务器的 classpath 中。日志配置文件应该保存到一个需要日志的人可以访问的位置。<br />
<br />
<br />
清单 6. 使用 DOMConfigurator 配置 Log4J<br />
<br />
/
<pre class="overflow">*<br />
* Configure Log4J library and periodically monitor log4j.xml for any update.<br />
*/<br />
DOMConfigurator.configureAndWatch("/apps/config/log4j.xml");</pre>
<br />
<br />
<br />
如果您的日志配置文件不能方便地进行访问（例如您的产品环境是由一个不同的组织进行维护的），那么您就必须使用一种不同的策略。标准的方法是使用 JMX，它提供了一个标准的 API 来管理自己的应用程序设置。在现代 JMX 兼容的服务器中，您可以使用管理 bean （或 MBeans ）来扩展应用服务器的管理终端的功能（更多有关使用 JMX 以及在 WebSphere Application Server 6.0 中使用 JMX 的内容，请参阅 参考资料 一节。）由于 JMX 方法非常复杂，如果您的情况需要使用 JMX，那就应该只用作这个用途。<br />
<br />
<strong>记录敏感的数据</strong><br />
<br />
在记录产品环境中的日志时，除了技术方面的挑战之外，还存在一些业务问题需要克服。例如，记录敏感的信息可能会引起安全性的问题。并没有任何限制可以防止您将某个用户的用户名和密码保存到正文文件中。您还必须要保护其他敏感信息，例如 e-mail 地址、电话号码以及帐号信息。安全顾问和设计师有责任要确保这些信息不会未加任何处理就保存到日志中。对敏感信息使用安全性专用的日志程序可以帮助降低风险。您可以给这个日志程序配置一个专用的附加器，从而使用一种加密的格式来保存消息，或者将其保存到一个安全的地方。然而，防止出现安全风险的最佳方法是在项目开始之前就设置适当的编码规范，并在检查代码时强制施行这些规范。<br />
<br />
<strong>从异常中提取有用信息</strong> <br />
<br />
当发生一个非预期的异常时 —— 例如，如果数据库连接突然失效了，或者系统资源变得很低了 —— 就必须对其适当地进行处理，否则就会丢失有用的信息，这些信息在诊断问题时是非常有帮助的。首先，必须记录异常及其堆栈跟踪状况。其次，应该使用一种用户界面友好的方式来标识错误页面，这对于终端用户和技术支持小组来说都是非常有帮助的。<br />
<br />
技术支持小组在接到一个技术支持电话时所面临的一个挑战是在用户所报告的问题与特定的日志异常之间建立某种关联。非常有用的一种简单技术是为每个异常都记录一个唯一的 ID。这个 ID 可以告诉用户，也可以包含在终端用户所填写的问题报告表单中。这样可以减少技术支持团队成员猜测的时间，让他们可以快速对问题作出响应。考虑到可读性的问题，可以定期对 ID 进行回收。<br />
<br />
<strong>日志文件的管理</strong><br />
<br />
一个非常繁忙的应用程序的日志文件可能会迅速变得非常大。较大的日志文件很难使用，这是因为它们需要过滤大量的噪声才能找到有用的信号。Log 循环 是常见的一个可以帮助解决这个问题的实践。日志循环会周期性地对旧日志进行归档，这样新消息就可以总能写到一个相对较小的文件中。日志消息降低了一些效用来提高速度；您可能很少需要参考一周之前的日志消息。在 Log4J 1.2 中， DailyRollingFileAppender 附加器可以根据所提供的日期模式来循环使用日志文件。（在 Log4J 1.3 中，已经对这个循环日志文件附加器重新进行了设计。现在您可以提供一种策略来控制如何进行循环了。例如， TimeBasedRollingPolicy 定义了一种基于时间和日期的循环模式。）清单 7 显示了让 Log4J 在每天午夜对自己的日志文件进行循环所采用的配置片断。 <br />
<br />
<br />
清单 7. 使用 DailyRollingFileAppender 循环使用日志文件<br />
<br />
<pre class="overflow">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;<br />
<br />
&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="File" value="log.txt"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="Append" value="true"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="DatePattern" value="'.'yyyy-MM-dd"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="ConversionPattern" value="%d [%t] %p - %m%n"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;<br />
&nbsp;&nbsp;&lt;/appender&gt;<br />
...<br />
&lt;/log4j:configuration&gt;</pre>
<br />
<br />
<br />
<strong>集群环境中的日志</strong><br />
<br />
现在有越来越多的企业级应用程序是在集群环境或分布式环境中进行部署的。然而，集群环境中的日志需要更多规划，因为消息都是从不同的源头生成的（通常是不同的机器）。如果要对不同的机器记录日志，那就必须对这些机器的时间戳进行同步，否则日志消息的次序就混乱了。对机器间时钟进行同步的一种简单方法是使用一个时间服务器。有两种方法可以设置时间服务器。您可以指定一台内部的机器作为时间服务器。然后其他机器就可以使用网络时间协议（NTP）来与时间服务器的时间戳进行同步。另外，您可以使用 Internet 上提供的时间服务器（请参阅 参考资料）。在 AIX 上，xntpd 守护进程用来对不同机器的系统时间进行同步。当机器具有相同的时间之后，就可以对日志一起进行分析了。<br />
<br />
在集群环境中搜集日志消息还面临着一些挑战。在这种环境中保存日志消息的一种简单方法是将它们保存到主机特定的日志文件中。当集群是使用 session affinity 配置时，这可以很好地工作 —— 如果对某个特定用户会话的请求都要到同一个服务器上，并且 EJB 也都是部署在本地的。在这种配置中，集群中的机器所产生的日志文件都可以独立进行分析。如果不是这种情况 —— 换而言之，如果任何给定的请求都可以由多台机器进行处理 —— 那么对不同日志文件中的日志消息进行分析就会变得更加困难。在这种情况中，一种好的办法是使用系统管理软件来管理日志消息，例如 IBM Tivoli&amp;reg; 软件（请参阅 参考资料 中的链接）。这种软件对所有的日志消息（在系统管理软件的术语中称之为 事件）提供了一个综合的视图，从而便于管理员使用。系统管理软件也可以根据所接收到的事件的类型触发一些操作（例如发送 e-mail 消息或传呼消息）。<br />
<br />
<strong>结束语</strong> <br />
<br />
在本文中，我们介绍了在规划日志策略时需要考虑哪些问题。正如在编程时所碰到的问题一样，从一开始就采用一个经过详细考虑的规划要比在进行的同时规划更能节省工作量。良好的日志策略可以极大地帮助对问题进行诊断。最终，终端用户可以获得更好的应用程序，并能从技术支持团队获得迅速的响应。<br />
原址: http://www-128.ibm.com/developerworks/cn/java/j-logging/</div>
<img src ="http://www.blogjava.net/masen/aggbug/202117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2008-05-22 11:40 <a href="http://www.blogjava.net/masen/articles/202117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j注意事项</title><link>http://www.blogjava.net/masen/articles/122945.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Fri, 08 Jun 2007 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/122945.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/122945.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/122945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/122945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/122945.html</trackback:ping><description><![CDATA[<table width="100%">
    <tbody>
        <tr>
            <td>
            <p><br>一、为多个项目指定使用哪个log4j文件<br>情况一：多个小项目合成一个大项目，多个小项目有自己不同的入口，这个时候如果使用同一个log4j文件，各个项目的输<br>出会混乱在一起，如果拆分成多个小项目，看起来又比较散不太好管理。<br>情况二：一个项目实施在linux上，编写在windows上,log4j的输出目录/opt/xxx/web.log<br>这个时候开发者被迫必须在本机的workspace所在的目录加入一个opt/xxx/web.log的目录和文件<br>同时，大多数情况下linux上的服务是不须要输出log到Console，只要输出到文件<br>而windows大部份是只须要输出到console，不须要输出到文件<br>本地调试的时候log4j的级别多是debug ,而实际实施的时候多是之上的级别<br>造成须要不停的修改log4j的属性文件,cvs同步的时候不停的提示<br>也许你说可以整个项目完成再来写log4j的属性文件，但有的时候这个效果并不好。<br>因为还有这种时候，项目完成（包括log），反复测试的这段时间。</p>
            <p>解决：解决办法很简单，建立一个log4j的配制文件的目录，在这个目录下为每个小项目建立一个目录，<br>每个目录下放着自己的log4j配制,然後把这些目录作为每个小工程的classpath的第一个，ok上边的问题就<br>解决了。这个时候可以写一个log4j放在src下，用来开发时候调试用，而真正服务器上使用的都在各自的文件夹下</p>
            <p>二,为默写包，某些类定义不同的log4j级别<br>是否想过这中需求呢，一个项目调试的时候，希望其中默写包不打出log信息。<br>比如struts的包，spring的包，还有你引用的别人已经开发好包，或者你自己写的类，但是你不想看到这个<br>类的log信息.但是你须要调试当前的一些class，log级别必须设置在debug级别<br>这个时候可以在log4j的属性文件中加入如下内容:<br>log4j.logger.包名or类名=高的级别<br>例如:<br>log4j.logger.org.springframework=error</p>
            <p>三、注意事项<br>&nbsp;&nbsp; <span>if</span> <span>(logger.isDebugEnabled())</span>&nbsp;<span id=Codehighlighter1_62_100_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> </span><span id=Codehighlighter1_62_100_Open_Text><span>{<br></span><span>4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(getStr());<br></span><span>5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span></p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/masen/aggbug/122945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-06-08 22:09 <a href="http://www.blogjava.net/masen/articles/122945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j配置相对路径实现日志记录(转)</title><link>http://www.blogjava.net/masen/articles/105955.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Fri, 23 Mar 2007 11:22:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/105955.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/105955.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/105955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/105955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/105955.html</trackback:ping><description><![CDATA[
		<div class="postbody">从网上简单搜索了一下，发现有三种介绍的方法。总结在这里<br />1. 
<p>解决的办法自然是想办法用相对路径代替绝对路径，其实log4j的FileAppender本身就有这样的机制，如：</p><p>log4j.appender.logfile.File=${WORKDIR}/logs/app.log</p><p>其中“${WORKDIR}/”是个变量，会被System Property中的“WORKDIR”的值代替。这样，我们就可以在log4j加载配置文件之前，先用System.setProperty设置好根路径。</p><p>在 没有发现这个技巧之前，为了解决这个问题，我曾自己扩展了log4j的RollingFileAppender类，其他的FileAppender同样道 理。扩展的方法，就是用一个子类去覆盖setFile方法，这个方法在log4j读取配置文件生成appender的时候调用，传入的就是配置文件中的路 径，这样我就可以按照自己的想法在路径前面加上根路径了。<br /></p><p>2.<br /></p><pre>可以使用环境变量<br />log4j.appender.R=org.apache.log4j.RollingFileAppender <br />log4j.appender.R.File=${catalina.base}/logs/logs_tomcat.log <br />log4j.appender.R.MaxFileSize=10KB<br /><br /><br /><br /><br /><br /><br />3.具体实现:<br /><br /><span id="BlogViewId" dragover="true"><div>一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便,目前我采用了动态改变日志路径方法来实现相对路径保存日志文件</div><br /></span> (1).在项目启动时,装入初始化类: <span id="BlogViewId" dragover="true"><br /><div>public class Log4jInit extends HttpServlet {<br />    static Logger logger = Logger.getLogger(Log4jInit.class);</div><br /><div>    public Log4jInit() {<br />    }</div><br /><div>    public void init(ServletConfig config) throws ServletException {<br />        String prefix = config.getServletContext().getRealPath("/");<br />        String file = config.getInitParameter("log4j");<br />        String filePath = prefix + file;<br />        Properties props = new Properties();<br />        try {<br />            FileInputStream istream = new FileInputStream(filePath);<br />            props.load(istream);<br />            istream.close();<br />            //toPrint(props.getProperty("log4j.appender.file.File"));<br />            String logFile = prefix + props.getProperty("log4j.appender.file.File");//设置路径<br />            props.setProperty("log4j.appender.file.File",logFile);<br />            PropertyConfigurator.configure(props);//装入log4j配置信息<br />        } catch (IOException e) {<br />            toPrint("Could not read configuration file [" + filePath + "].");<br />            toPrint("Ignoring configuration file [" + filePath + "].");<br />            return;<br />        }</div><br /><div>    }</div><br /><div>    public static void toPrint(String content) {<br />        System.out.println(content);<br />    }</div><br /><div>}</div><br /><div>(2).Web.xml中的配置</div><br /><div>&lt;servlet&gt;<br />    &lt;servlet-name&gt;log4j-init&lt;/servlet-name&gt;<br />    &lt;servlet-class&gt;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/classes/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;<br /><br />最后决定 在项目中选择第二种比较方便</div></span></pre></div>
<img src ="http://www.blogjava.net/masen/aggbug/105955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-03-23 19:22 <a href="http://www.blogjava.net/masen/articles/105955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Log4j] 配置Log4j</title><link>http://www.blogjava.net/masen/articles/105927.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Fri, 23 Mar 2007 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/105927.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/105927.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/105927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/105927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/105927.html</trackback:ping><description><![CDATA[
		<div class="postcontent">
				<p>
						<font face="Arial" size="2">Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的，它可接key=value格式的设置或xml格式的设置信息。通过配置，可以创建出Log4J的运行环境。<br /><br /><strong>1. 配置文件</strong><br />Log4J配置文件的基本格式如下： </font>
				</p>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<font face="Arial" size="2">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</font>
						<font face="Arial">
								<font size="2">
										<span style="COLOR: #000000">#配置根Logger<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="FONT-WEIGHT: bold; COLOR: #800000">[</span>
										<span style="COLOR: #800000">level</span>
										<span style="FONT-WEIGHT: bold; COLOR: #800000">]</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">,</span>
										<span style="COLOR: #000000"> appenderName1</span>
										<span style="COLOR: #000000">,</span>
										<span style="COLOR: #000000"> appenderName2</span>
										<span style="COLOR: #000000">,</span>
								</font>
						</font>
						<font face="Arial">
								<font size="2">
										<span style="COLOR: #000000"> …<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#配置日志信息输出目的地Appender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.appenderName </span>
										<span style="COLOR: #000000">=</span>
								</font>
						</font>
						<font face="Arial">
								<font size="2">
										<span style="COLOR: #000000"> fully.qualified.name.of.appender.class <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　log4j.appender.appenderName.option1 </span>
										<span style="COLOR: #000000">=</span>
								</font>
						</font>
						<font face="Arial">
								<font size="2">
										<span style="COLOR: #000000"> value1 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　… <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　log4j.appender.appenderName.optionN </span>
										<span style="COLOR: #000000">=</span>
								</font>
						</font>
						<font face="Arial">
								<font size="2">
										<span style="COLOR: #000000"> valueN <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#配置日志信息的格式（布局）<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.appenderName.layout </span>
										<span style="COLOR: #000000">=</span>
								</font>
						</font>
						<font face="Arial">
								<font size="2">
										<span style="COLOR: #000000"> fully.qualified.name.of.layout.class <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　log4j.appender.appenderName.layout.option1 </span>
										<span style="COLOR: #000000">=</span>
								</font>
						</font>
						<font face="Arial">
								<font size="2">
										<span style="COLOR: #000000"> value1 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　… <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　log4j.appender.appenderName.layout.optionN </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> valueN </span>
								</font>
						</font>
				</div>
				<br />
				<font face="Arial" size="2">其中 <strong>[level] </strong>是日志输出级别，共有5级：<br /></font>
				<span style="COLOR: #000000">
						<strong>
								<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
										<font face="Arial" size="2">
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
												<span style="COLOR: #000000">FATAL     </span>
												<span style="COLOR: #000000">0</span>
										</font>
										<font face="Arial">
												<font size="2">
														<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ERROR     </span>
														<span style="COLOR: #000000">3</span>
												</font>
										</font>
										<font face="Arial">
												<font size="2">
														<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />WARN      </span>
														<span style="COLOR: #000000">4</span>
												</font>
										</font>
										<font face="Arial">
												<font size="2">
														<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />INFO      </span>
														<span style="COLOR: #000000">6</span>
												</font>
										</font>
										<font face="Arial">
												<font size="2">
														<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DEBUG     </span>
														<span style="COLOR: #000000">7</span>
												</font>
										</font>
										<span style="COLOR: #000000">
												<br />
												<font face="Arial" size="2">
														<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
												</font>
										</span>
								</div>
								<br />
								<font face="Arial" size="2">Appender </font>
						</strong>
						<font face="Arial" size="2">为日志输出目的地，Log4j提供的appender有以下几种：<br /></font>
						<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
								<font face="Arial" size="2">
										<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								</font>
								<span style="COLOR: #000000">
										<font face="Arial" size="2">org.apache.log4j.ConsoleAppender（控制台），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.FileAppender（文件），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） </font>
								</span>
						</div>
				</span>
				<br />
				<font face="Arial">
						<font size="2">
								<font color="#303030">
										<strong>Layout</strong>：日志输出格式，Log4j提供的layout有以下几种：<br /></font>
						</font>
				</font>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<font face="Arial" size="2">
								<font color="#303030">
										<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								</font>
						</font>
						<span style="COLOR: #000000">
								<font face="Arial" size="2">org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </font>
						</span>
				</div>
				<br />
				<font face="Arial">
						<font size="2">
								<strong>打印参数: </strong>Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，如下:<br /></font>
				</font>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<font face="Arial" size="2">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</font>
						<font face="Arial">
								<font size="2">
										<span style="COLOR: #000000">　　<strong>%m</strong>   输出代码中指定的消息<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%p</strong>   输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%r</strong>   输出自应用启动到输出该log信息耗费的毫秒数 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%c</strong>   输出所属的类目，通常就是所在类的全名 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%t</strong>   输出产生该日志事件的线程名 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%n </strong>  输出一个回车换行符，Windows平台为“\r\n”，Unix平台为“\n” <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%d</strong>   输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss</span>
										<span style="COLOR: #000000">,</span>
										<span style="COLOR: #000000">SSS}，输出类似：2002年10月18日 </span>
										<span style="COLOR: #000000">22</span>
										<span style="COLOR: #000000">：</span>
										<span style="COLOR: #000000">10</span>
										<span style="COLOR: #000000">：</span>
										<span style="COLOR: #000000">28</span>
										<span style="COLOR: #000000">，</span>
										<span style="COLOR: #000000">921</span>
								</font>
						</font>
						<font face="Arial">
								<font size="2">
										<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%l </strong>  输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:</span>
										<span style="COLOR: #000000">10</span>
										<span style="COLOR: #000000">) <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
								</font>
						</font>
				</div>
				<br />
				<font face="Arial">
						<font size="2">
								<strong>2. 在代码中初始化Logger:</strong>
								<br />1）在程序中调用<strong>BasicConfigurator.configure()</strong>方法：给根记录器增加一个ConsoleAppender，输出格式通过PatternLayout设为<strong>"%-4r [%t] %-5p %c %x - %m%n"</strong>，还有根记录器的默认级别是<strong>Level.DEBUG</strong>. <br />2）配置放在文件里，通过命令行参数传递文件名字，通过<strong>PropertyConfigurator.configure(args[x])</strong>解析并配置；<br />3）配置放在文件里，通过环境变量传递文件名等信息，利用log4j默认的初始化过程解析并配置；<br />4）配置放在文件里，通过应用服务器配置传递文件名等信息，利用一个特殊的servlet来完成配置。<br /><br /><strong>3. 为不同的 Appender 设置日志输出级别：</strong><br />当调试系统时，我们往往注意的只是异常级别的日志输出，但是通常所有级别的输出都是放在一个文件里的，如果日志输出的级别是BUG！？那就慢慢去找吧。<br />这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以，Log4j已经提供了这样的功能，我们只需要在配置中修改<strong>Appender</strong>的<font color="#990000"><strong>Threshold</strong></font></font>
				</font>
				<font color="#000000">
						<font face="Arial" size="2">就能实现,比如下面的例子：<br /><br /><strong>[配置文件]</strong><br /></font>
						<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
								<p>
										<font face="Arial" size="2">
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
										</font>
										<font face="Arial">
												<font size="2">
														<span style="COLOR: #000000">### set log levels ###<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger = info,stdout,D ,E</span>
												</font>
										</font>
								</p>
								<font face="Arial">
										<font size="2">
												<span style="COLOR: #000000">
														<p>
																<br />log4j.appender.stdout = org.apache.log4j.ConsoleAppender<br />log4j.appender.stdout.Target = System.out<br />log4j.appender.stdout.layout = org.apache.log4j.PatternLayout<br />log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n</p>
														<p>
																<br />log4j.appender.D = org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.D.File = logs/log.log<br />log4j.appender.D.Append = true<br />log4j.appender.D.Threshold = DEBUG <br />log4j.appender.D.layout = org.apache.log4j.PatternLayout<br />log4j.appender.D.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n</p>
														<p> </p>
														<p>log4j.appender.E = org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.E.File = logs/error.log <br />log4j.appender.E.Append = true<br />log4j.appender.E.Threshold = ERROR <br />log4j.appender.E.layout = org.apache.log4j.PatternLayout<br />log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n</p>
												</span>
										</font>
								</font>
						</div>
				</font>
				<br />
				<font face="Arial">
						<font size="2">
								<font color="#303030">
										<strong>[代码中使用]</strong>
										<br />
								</font>
						</font>
				</font>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<font face="Arial">
								<font size="2">
										<font color="#303030">
												<img id="Codehighlighter1_23_240_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_240_Open_Text.style.display='none'; Codehighlighter1_23_240_Closed_Image.style.display='inline'; Codehighlighter1_23_240_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
										</font>
										<img id="Codehighlighter1_23_240_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_240_Closed_Text.style.display='none'; Codehighlighter1_23_240_Open_Image.style.display='inline'; Codehighlighter1_23_240_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
										<span style="COLOR: #0000ff">public</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">class</span>
										<span style="COLOR: #000000"> TestLog4j </span>
										<span id="Codehighlighter1_23_240_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.blogjava.net/images/dot.gif" />
										</span>
								</font>
						</font>
						<span id="Codehighlighter1_23_240_Open_Text">
								<font face="Arial">
										<font size="2">
												<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_65_238_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_238_Open_Text.style.display='none'; Codehighlighter1_65_238_Closed_Image.style.display='inline'; Codehighlighter1_65_238_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_65_238_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_65_238_Closed_Text.style.display='none'; Codehighlighter1_65_238_Open_Image.style.display='inline'; Codehighlighter1_65_238_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
												<span style="COLOR: #0000ff">public</span>
												<span style="COLOR: #000000"> </span>
												<span style="COLOR: #0000ff">static</span>
												<span style="COLOR: #000000"> </span>
												<span style="COLOR: #0000ff">void</span>
												<span style="COLOR: #000000"> main(String[] args) </span>
												<span id="Codehighlighter1_65_238_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
														<img src="http://www.blogjava.net/images/dot.gif" />
												</span>
										</font>
								</font>
								<span id="Codehighlighter1_65_238_Open_Text">
										<font face="Arial">
												<font size="2">
														<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        PropertyConfigurator.configure(</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">D:/Code/conf/log4j.properties</span>
														<span style="COLOR: #000000">"</span>
												</font>
										</font>
										<font face="Arial">
												<font size="2">
														<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Logger logger </span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #000000"> Logger.getLogger(TestLog4j.</span>
														<span style="COLOR: #0000ff">class</span>
												</font>
										</font>
										<font face="Arial">
												<font size="2">
														<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        logger.debug(</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">debug</span>
														<span style="COLOR: #000000">"</span>
												</font>
										</font>
										<font face="Arial">
												<font size="2">
														<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        logger.error(</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">error</span>
														<span style="COLOR: #000000">"</span>
												</font>
										</font>
										<span style="COLOR: #000000">
												<font face="Arial" size="2">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</font>
										</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<font face="Arial" size="2">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</font>
								</span>
						</span>
				</div>
				<br />
				<font face="Arial" size="2">运行一下，看看异常信息是不是保存在了一个单独的文件error.log中。</font>
		</div>
<img src ="http://www.blogjava.net/masen/aggbug/105927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-03-23 17:02 <a href="http://www.blogjava.net/masen/articles/105927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>  Log4J 最佳实践之全能配置文件(转）</title><link>http://www.blogjava.net/masen/articles/105923.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Fri, 23 Mar 2007 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/105923.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/105923.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/105923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/105923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/105923.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<br />
				<br />LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了， <br /><br /><br /><br />log4j.rootLogger=DEBUG,CONSOLE,A1,im <br />log4j.addivity.org.apache=true <br /><br /><br /><br /># 应用于控制台 <br /><br />log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br />log4j.appender.Threshold=DEBUG <br />log4j.appender.CONSOLE.Target=System.out <br />log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n <br /><br /><br />#应用于文件 <br /><br />log4j.appender.FILE=org.apache.log4j.FileAppender <br />log4j.appender.FILE.File=file.log <br />log4j.appender.FILE.Append=false <br />log4j.appender.FILE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /># Use this layout for LogFactor 5 analysis <br /><br /><br /><br /># 应用于文件回滚 <br /><br />log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender <br />log4j.appender.ROLLING_FILE.Threshold=ERROR <br />log4j.appender.ROLLING_FILE.File=rolling.log <br />log4j.appender.ROLLING_FILE.Append=true <br />log4j.appender.ROLLING_FILE.MaxFileSize=10KB <br />log4j.appender.ROLLING_FILE.MaxBackupIndex=1 <br />log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /><br /><br />#应用于socket <br />log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender <br />log4j.appender.SOCKET.RemoteHost=localhost <br />log4j.appender.SOCKET.Port=5001 <br />log4j.appender.SOCKET.LocationInfo=true <br /># Set up for Log Facter 5 <br />log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout <br />log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n <br /><br /><br /># Log Factor 5 Appender <br />log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender <br />log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 <br /><br /><br /><br /># 发送日志给邮件 <br /><br />log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender <br />log4j.appender.MAIL.Threshold=FATAL <br />log4j.appender.MAIL.BufferSize=10 <br />log4j.appender.MAIL.From=web@www.wuset.com <br />log4j.appender.MAIL.SMTPHost=www.wusetu.com <br />log4j.appender.MAIL.Subject=Log4J Message <br />log4j.appender.MAIL.To=web@www.wusetu.com <br />log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout <br />log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /><br /><br /><br /># 用于数据库 <br />log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender <br />log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test <br />log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver <br />log4j.appender.DATABASE.user=root <br />log4j.appender.DATABASE.password= <br />log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') <br />log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /><br /><br />log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br />log4j.appender.A1.File=SampleMessages.log4j <br />log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' <br />log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout <br /><br />#自定义Appender <br /><br />log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender <br /><br />log4j.appender.im.host = mail.cybercorlin.net <br />log4j.appender.im.username = username <br />log4j.appender.im.password = password <br />log4j.appender.im.recipient = corlin@cybercorlin.net <br /><br />log4j.appender.im.layout=org.apache.log4j.PatternLayout <br />log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n </div>
<img src ="http://www.blogjava.net/masen/aggbug/105923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-03-23 16:52 <a href="http://www.blogjava.net/masen/articles/105923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>