﻿<?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-XZC.Log-随笔分类-Log4j</title><link>http://www.blogjava.net/xzclog/category/17325.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 23 May 2008 20:25:03 GMT</lastBuildDate><pubDate>Fri, 23 May 2008 20:25:03 GMT</pubDate><ttl>60</ttl><item><title>Log4j日志管理系统简单使用说明 </title><link>http://www.blogjava.net/xzclog/archive/2008/05/21/201845.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 21 May 2008 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/05/21/201845.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/201845.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/05/21/201845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/201845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/201845.html</trackback:ping><description><![CDATA[&nbsp;Log4j有三个主要的组件：Loggers，Appenders和Layouts，这里可简单理解为日志类别，日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和级别，并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明：
<p style="margin-right: 0px" align="left"><strong>1、 Loggers</strong></p>
<p style="margin-right: 0px" align="left"><strong>&nbsp;&nbsp;&nbsp; </strong>Loggers组件在此系统中被分为五个级别：DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的，DEBUG &lt; INFO &lt; WARN &lt; ERROR &lt; FATAL，明白这一点很重要，这里Log4j有一个规则：假设Loggers级别为P，如果在Loggers中发生了一个级别Q比P高，则可以启动，否则屏蔽掉。</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p style="margin-right: 0px" align="left"><strong>Java程序举例来说：</strong></p>
<p style="margin-right: 0px" align="left">//建立Logger的一个实例，命名为&#8220;com.foo&#8221;</p>
<p style="margin-right: 0px" align="left">Logger&nbsp; logger = Logger.getLogger("com.foo");</p>
<p style="margin-right: 0px" align="left">//设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。</p>
<p style="margin-right: 0px" align="left">logger.setLevel(Level.INFO);</p>
<p style="margin-right: 0px" align="left">Logger barlogger = Logger.getLogger("com.foo.Bar");</p>
<p style="margin-right: 0px" align="left">//下面这个请求可用，因为WARN &gt;= INFO</p>
<p style="margin-right: 0px" align="left">logger.warn("Low fuel level.");</p>
<p style="margin-right: 0px" align="left">//下面这个请求不可用，因为DEBUG &lt; INFO</p>
<p style="margin-right: 0px" align="left">logger.debug("Starting search for nearest gas station.");</p>
<p style="margin-right: 0px" align="left">//命名为&#8220;com.foo.bar&#8221;的实例barlogger会继承实例&#8220;com.foo&#8221;的级别。因此，下面这个请求可用，因为INFO &gt;= INFO</p>
<p style="margin-right: 0px" align="left">barlogger.info("Located nearest gas station.");</p>
<p style="margin-right: 0px" align="left">//下面这个请求不可用，因为DEBUG &lt; INFO</p>
<p style="margin-right: 0px" align="left">barlogger.debug("Exiting gas station search");&nbsp;</p>
<p style="margin-right: 0px" align="left"><strong>这里&#8220;是否可用&#8221;的意思是能否输出Logger信息。</strong>&nbsp;</p>
</blockquote>
<p style="margin-right: 0px" align="left">&nbsp;&nbsp;&nbsp; 在对Logger实例进行命名时，没有限制，可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例，这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息，便于管理。比如：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p style="margin-right: 0px" align="left">static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());</p>
</blockquote>
<p style="margin-right: 0px" align="left"><strong>2、 Appenders</strong></p>
<p dir="ltr" style="margin-right: 0px" align="left">&nbsp;&nbsp;&nbsp; 禁用与使用日志请求只是Log4j其中的一个小小的地方，Log4j日志系统允许把日志输出到不同的地方，如控制台（Console）、文件（Files）、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p style="margin-right: 0px" align="left">其语法表示为：</p>
<p style="margin-right: 0px" align="left">org.apache.log4j.ConsoleAppender（控制台），</p>
<p style="margin-right: 0px" align="left"><br />
org.apache.log4j.FileAppender（文件），<br />
org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br />
org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）</p>
<p style="margin-right: 0px" align="left">配置时使用方式为：</p>
<p style="margin-right: 0px" align="left">log4j.appender.appenderName = fully.qualified.name.of.appender.class</p>
<p style="margin-right: 0px" align="left">log4j.appender.appenderName.option1 = value1</p>
<p style="margin-right: 0px" align="left">&#8230;</p>
<p style="margin-right: 0px" align="left">log4j.appender.appenderName.option = valueN</p>
<p style="margin-right: 0px" align="left">这样就为日志的输出提供了相当大的便利。</p>
</blockquote>
<p style="margin-right: 0px" align="left"><strong>3、 Layouts</strong></p>
<p style="margin-right: 0px" align="left">&nbsp;&nbsp;&nbsp; 有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四种日志输出样式，如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p dir="ltr" style="margin-right: 0px" align="left">其语法表示为：</p>
<p dir="ltr" style="margin-right: 0px" align="left">org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）</p>
<p dir="ltr" style="margin-right: 0px" align="left">配置时使用方式为：</p>
</blockquote>
<p dir="ltr" style="margin-right: 0px" align="left">&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fully.qualified.name.of.layout.class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.appenderName.layout.option1 = value1<br />
&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout.option = valueN<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 以上是从原理方面说明Log4j的使用方法，在具体<span style="background-color: yellow">Java编程</span>使用Log4j可以参照以下示例：<br />
<strong>1、 建立Logger实例：<br />
</strong>&nbsp;&nbsp;&nbsp; 语法表示：public static Logger getLogger( String name)<br />
&nbsp;&nbsp;&nbsp; 实际使用：static Logger logger = Logger.getLogger&nbsp;&nbsp; (ServerWithLog4j.class.getName ()) ;<br />
<strong>2、 读取配置文件：</strong><br />
&nbsp;&nbsp;&nbsp; 获得了Logger的实例之后，接下来将配置Log4j使用环境：<br />
&nbsp;&nbsp;&nbsp; 语法表示：<br />
&nbsp;&nbsp;&nbsp; BasicConfigurator.configure()：自动快速地使用缺省Log4j环境。<br />
&nbsp;&nbsp;&nbsp; <span style="background-color: yellow">PropertyConfigurator.configure(String configFilename)：读取使用Java的特性文件编写的配置文件。</span><br />
&nbsp;&nbsp;&nbsp; DOMConfigurator.configure(String filename)：读取XML形式的配置文件。<br />
&nbsp;&nbsp;&nbsp; <span style="background-color: yellow">实际使用：PropertyConfigurator.configure("ServerWithLog4j.properties");<br />
</span><strong>3、 插入日志信息</strong><br />
&nbsp;&nbsp;&nbsp; 完成了以上连个步骤以后，下面就可以按日志的不同级别插入到你要记录日志的任何地方了。<br />
&nbsp;&nbsp;&nbsp; 语法表示：<br />
&nbsp;&nbsp;&nbsp; Logger.debug(Object message);<br />
&nbsp;&nbsp;&nbsp; Logger.info(Object message);<br />
&nbsp;&nbsp;&nbsp; Logger.warn(Object message);<br />
&nbsp;&nbsp;&nbsp; Logger.error(Object message);<br />
&nbsp;&nbsp;&nbsp; 实际使用：logger.info("ServerSocket before accept: " + server);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; <span style="background-color: yellow">在实际编程时，要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用，具体如下：</span><span style="background-color: yellow"><br />
</span><strong>1、 配置根Logger</strong>，其语法为：<br />
&nbsp;&nbsp;&nbsp; log4j.rootLogger = [ level ] , appenderName, appenderName, &#8230;<br />
这里level指Logger的优先级，appenderName是日志信息的输出地，可以同时指定多个输出地。如：log4j.rootLogger= INFO,A1,A2<br />
<strong>2、 配置日志信息输出目的地</strong>，其语法为：<br />
&nbsp;&nbsp;&nbsp; log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />
&nbsp;&nbsp;&nbsp; 可以指定上面所述五个目的地中的一个。<br />
<strong>3、 配置日志信息的格式</strong>，其语法为：<br />
&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />
&nbsp;&nbsp;&nbsp; 这里上面三个步骤是对前面Log4j组件说明的一个简化；下面给出一个具体配置例子，在程序中可以参照执行：<br />
&nbsp;&nbsp;&nbsp; log4j.rootLogger=INFO,A1<br />
&nbsp;&nbsp;&nbsp; log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
&nbsp;&nbsp;&nbsp; log4j.appender.A1.layout.ConversionPattern=<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n<br />
&nbsp;&nbsp;&nbsp; 这里需要说明的就是日志信息格式中几个符号所代表的含义：<br />
&nbsp;&nbsp;&nbsp; －X号: X信息输出时左对齐；<br />
&nbsp;&nbsp;&nbsp; %p: 日志信息级别<br />
&nbsp;&nbsp;&nbsp; %d{}: 日志信息产生时间<br />
&nbsp;&nbsp;&nbsp; %c: 日志信息所在地（类名）<br />
&nbsp;&nbsp;&nbsp; %m: 产生的日志具体信息<br />
&nbsp;&nbsp;&nbsp; %n: 输出日志信息换行<br />
&nbsp;<br />
<strong>根据上面的日志格式，某一个程序的输出结果如下：</strong><br />
0&nbsp;&nbsp;&nbsp; INFO&nbsp; 2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]<br />
16&nbsp;&nbsp; DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'<br />
16&nbsp;&nbsp; DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD<br />
16&nbsp;&nbsp; DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'<br />
16&nbsp;&nbsp; DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP<br />
16&nbsp;&nbsp; DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'<br />
16&nbsp;&nbsp; DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT<br />
</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/201845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-05-21 10:36 <a href="http://www.blogjava.net/xzclog/archive/2008/05/21/201845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统日志分类别输出至日志文件[Log4j应用]</title><link>http://www.blogjava.net/xzclog/archive/2008/05/21/201844.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 21 May 2008 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/05/21/201844.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/201844.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/05/21/201844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/201844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/201844.html</trackback:ping><description><![CDATA[&nbsp;在<a class="mykeyword" title="http://project.icnote.com/" href="http://project.icnote.com/" target="_blank">项目</a>的开发过程中，系统对日志的要求很细，而且要求分类清楚。所以还是采用了Log4J。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在强调可重用组件开发的今天，除了自己从头到尾开发一个可重用的日志操作类外，Apache为我们提供了一个强有力的日志操作包-Log4j。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log4j是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此外，通过Log4j其他语言接口，您可以在C、php、C++、.Net、PL/SQL程序中使用Log4j，其语法和用法与在Java程序中一样，使得多语言分布式系统得到一个统一一致的日志组件模块。而且，通过使用各种第三方扩展，您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。<br />
<a name="entrymore"></a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>Log4j配置文件详细说明（*.properties和*.xml）</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<strong>属性文件Properties</strong><br />
<br />
properties属性文件 <br />
<br />
编号 配置项 配置项描述 示例 <br />
1 log4j.threshold 阈值项 <span style="background-color: yellow">log4j.threshold = error <br />
</span>2 log4j.rootLogger 根日志属性项 <span style="background-color: yellow">log4j.rootLogger = info,stdout1,stdout2 </span><br />
3 log4j.category. 子日志属性项（旧） <span style="background-color: #ffffff">log4j.category.com.eos = NULL,stdout1 <br />
</span>4 log4j.logger. 子日志属性项（新） <span style="background-color: yellow">log4j.logger.com.eos.log = debug,stdout2 <br />
</span>5 log4j.additivity. appender是否继承设置 <span style="background-color: yellow">log4j.additivity.com.eos = false </span><br />
6 log4j.appender. 输出目的地定义项 <span style="background-color: #ffff00">log4j.appender.stdout2 = org.apache.log4j.ConsoleAppender <br />
</span>7 log4j.appender.A.layout 输出格式定义项 <span style="background-color: #ffff00">log4j.appender.stdout2.layout = org.apache.log4j.PatternLayout <br />
</span><br />
<strong>xml文件 </strong><br />
<br />
编号 配置项 配置项描述 示例 <br />
1 threshold 阈值项 <LOG4J:CONFIGURATION xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false" threshold="null"><br />
2 root 根日志属性项 <root><br />
&nbsp;&nbsp;&nbsp;&nbsp;
<priority value="info"  /><br />
&nbsp;&nbsp;&nbsp;&nbsp; <appender-ref ref="CONSOLE"  /><br />
&nbsp;&nbsp; </root><br />
3 priority 级别项（旧）
<priority value="info"  /><br />
4 level 级别项（新） <level value="info"  /><br />
5 category 子日志属性项（旧） <category name="com.eos.log" additivity="true"><br />
6 logger 子日志属性项（新） <logger name="com.eos" additivity="true"><br />
7 appender-ref 输出端控制项 <appender-ref ref="CONSOLE"  /><br />
8 additivity appender是否继承设置 <logger name="com.eos" additivity="true"><br />
9 appender 输出目的地定义项 <appender class="org.apache.log4j.ConsoleAppender" name="CONSOLE"><br />
10 layout 输出格式定义项 <layout class="org.apache.log4j.PatternLayout"><br />
<br />
<strong>详细说明（只针对Log4j常用的，用户可以自定义）Appender</strong><br />
Appender继承关系<br />
Appender基本种类<br />
org.apache.log4j.ConsoleAppender（控制台）<br />
org.apache.log4j.FileAppender（文件）<br />
org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />
org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）<br />
org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />
&#183; ConsoleAppender选项<br />
Threshold=WARN:指定日志消息的输出最低层次。<br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
Target=System.err：默认情况下是：System.out,指定输出控制台<br />
&#183; FileAppender 选项<br />
Threshold=WARN:指定日志消息的输出最低层次。<br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
File=mylog.txt:指定消息输出到mylog.txt文件。<br />
Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />
&#183; DailyRollingFileAppender 选项<br />
Threshold=WARN:指定日志消息的输出最低层次。<br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
File=mylog.txt:指定消息输出到mylog.txt文件。<br />
Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />
DatePattern='.'yyyy-ww:每周滚动一次文件，即每周产生一个新的文件。当然也可以指定按月、周、<br />
天、时和分。即对应的格式如下：<br />
1)'.'yyyy-MM: 每月<br />
2)'.'yyyy-ww: 每周<br />
3)'.'yyyy-MM-dd: 每天<br />
4)'.'yyyy-MM-dd-a: 每天两次<br />
5)'.'yyyy-MM-dd-HH: 每小时<br />
6)'.'yyyy-MM-dd-HH-mm: 每分钟<br />
n RollingFileAppender 选项<br />
Threshold=WARN:指定日志消息的输出最低层次。<br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
File=mylog.txt:指定消息输出到mylog.txt文件。<br />
Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时，将会自动滚动，即将原来<br />
的内容移到mylog.log.1文件。<br />
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。 <br />
<br />
<strong>详细说明（只针对Log4j，用户可以自定义）Layout</strong><br />
Log4j的Layout基本种类<br />
org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />
&#183; HTMLLayout选项<br />
LocationInfo=true:默认值是false,输出java文件名称和行号<br />
Title=my app file: 默认值是 Log4J Log Messages.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
n PatternLayout 选项<br />
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n<br />
这里需要说明的就是日志信息格式中几个符号所代表的含义：<br />
<br />
%X: 信息输出时左对齐；<br />
%p: 输出日志信息优先级，即DEBUG，INFO，WARN，ERROR，FATAL,<br />
%d: 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921<br />
%r: 输出自应用启动到输出该log信息耗费的毫秒数<br />
%c: 输出日志信息所属的类目，通常就是所在类的全名<br />
%t: 输出产生该日志事件的线程名<br />
%l: 输出日志事件的发生位置，相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10)<br />
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。<br />
%%: 输出一个"%"字符<br />
%F: 输出日志消息产生时所在的文件名称<br />
%L: 输出代码中的行号<br />
%m: 输出代码中指定的消息,产生的日志具体信息<br />
%n: 输出一个回车换行符，Windows平台为"\r\n"，Unix平台为"\n"输出日志信息换行，可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如：<br />
1)%20c：指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，默认的情况下右对齐。<br />
2)%-20c:指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，"-"号指定左对齐。<br />
3)%.30c:指定输出category的名称，最大的宽度是30，如果category的名称大于30的话，就会将左边多出的字符截掉，但小于30的话也不会有空格。<br />
4)%20.30c:如果category的名称小于20就补空格，并且右对齐，如果其名称长于30字符， 就从左边交远销出的字符截掉。<br />
&#183; XMLLayout 选项<br />
LocationInfo=true:默认值是false,输出java文件和行号<br />
<br />
<strong>日志配置文件内容范例</strong>&nbsp;&nbsp; <br />
log4j.properties<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.icnote.com/#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.icnote.com/#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.icnote.com/#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.icnote.com/#">?</a></div>
</div>
<ol class="dp-j">
    <li class="alt"><span><span>log4j.rootLogger=DEBUG,&nbsp;CONSOLE&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>#DEBUG,&nbsp;CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span style="background-color: yellow">#log4j.threshold=WARN</span>
    <li class="alt">
    <li class=""><span style="background-color: yellow">log4j.logger.org.apache=INFO,&nbsp;FILE&nbsp;</span>
    <li class="alt"><span><span style="background-color: yellow">log4j.additivity.org.apache=<span class="keyword">false</span></span></span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>###################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>#&nbsp;Console&nbsp;Appender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>###################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span><span style="background-color: yellow">log4j.appender.Threshold=DEBUG&nbsp;&nbsp;&nbsp;</span>&nbsp;</span>
    <li class=""><span>log4j.appender.CONSOLE.Target=System.out&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.CONSOLE.layout.ConversionPattern=%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>#####################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>#&nbsp;File&nbsp;Appender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>#####################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.FILE=org.apache.log4j.FileAppender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.FILE.File=file.log&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.FILE.Append=</span><span class="keyword">false</span><span>&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>log4j.appender.FILE.layout=org.apache.log4j.PatternLayout&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.FILE.layout.ConversionPattern=%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>########################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>#&nbsp;Rolling&nbsp;File&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>########################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.ROLLING_FILE.Threshold=ERROR&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.ROLLING_FILE.File=rolling.log&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.ROLLING_FILE.Append=</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>log4j.appender.ROLLING_FILE.MaxFileSize=10KB&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.ROLLING_FILE.MaxBackupIndex=</span><span class="number">1</span><span>&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>####################&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>#&nbsp;Socket&nbsp;Appender&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>####################&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.SOCKET.RemoteHost=localhost&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.SOCKET.Port=</span><span class="number">5001</span><span>&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>log4j.appender.SOCKET.LocationInfo=</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>#&nbsp;Set&nbsp;up&nbsp;</span><span class="keyword">for</span><span>&nbsp;Log&nbsp;Facter&nbsp;</span><span class="number">5</span><span>&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.SOCET.layout.ConversionPattern=%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>########################&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>#&nbsp;Log&nbsp;Factor&nbsp;</span><span class="number">5</span><span>&nbsp;Appender&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>########################&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.LF5_APPENDER.MaxNumberOfRecords=</span><span class="number">2000</span><span>&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>########################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>#&nbsp;SMTP&nbsp;Appender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>#######################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.MAIL.Threshold=FATAL&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.MAIL.BufferSize=</span><span class="number">10</span><span>&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>log4j.appender.MAIL.From=wuyh</span><span class="annotation">@primeton</span><span>.com&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>log4j.appender.MAIL.SMTPHost=mail.primeton.com&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.MAIL.Subject=Log4J&nbsp;Message&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.MAIL.To=test</span><span class="annotation">@primeton</span><span>.com&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.MAIL.layout.ConversionPattern=%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>########################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>#&nbsp;JDBC&nbsp;Appender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>#######################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.DATABASE.URL=jdbc:mysql:</span><span class="comment">//localhost:3306/test&nbsp; </span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.DATABASE.user=root&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.DATABASE.password=&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.DATABASE.sql=INSERT&nbsp;INTO&nbsp;LOG4J&nbsp;(Message)&nbsp;VALUES&nbsp;(%d&nbsp;[%p]&nbsp;-&nbsp;%m%n)&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.DATABASE.layout.ConversionPattern=%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.A1.File=SampleMessages.log4j&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.A1.DatePattern=yyyyMMdd-HH</span><span class="string">'.log4j'</span><span>&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>###################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>#自定义Appender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>###################&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.im&nbsp;=&nbsp;net.cybercorlin.util.logger.appender.IMAppender&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.im.host&nbsp;=&nbsp;mail.cybercorlin.net&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.im.username&nbsp;=&nbsp;username&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.im.password&nbsp;=&nbsp;password&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.im.recipient&nbsp;=&nbsp;wuyh</span><span class="annotation">@primeton</span><span>.com&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>log4j.appender.im.layout=org.apache.log4j.PatternLayout&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.im.layout.ConversionPattern&nbsp;=%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<textarea class="java" style="display: none" name="code" rows="15" cols="100">log4j.rootLogger=DEBUG, CONSOLE
#DEBUG, CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.logger.org.apache=INFO, FILE
log4j.additivity.org.apache=false
###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d [%p] - %m%n
#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d [%p] - %m%n
########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d [%p] - %m%n
####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=%d [%p] - %m%n
########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=wuyh@primeton.com
log4j.appender.MAIL.SMTPHost=mail.primeton.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=test@primeton.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=%d [%p] - %m%n
########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES (%d [%p] - %m%n)
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=%d [%p] - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
###################
#自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = wuyh@primeton.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =%d [%p] - %m%n </textarea><br />
<br />
#注意：在属性配置文件中，属性值的第一个一定是级别，输出端可有可无，以逗号分割。（而xml文件格式没有这种限制）<br />
<br />
log4j.xml<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.icnote.com/#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.icnote.com/#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.icnote.com/#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.icnote.com/#">?</a></div>
</div>
<ol class="dp-j">
    <li class="alt"><span><span>&lt;&nbsp;xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"UTF-8"</span><span>&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;!DOCTYPE&nbsp;log4j:configuration&nbsp;SYSTEM&nbsp;</span><span class="string">"log4j.dtd"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;log4j:configuration&nbsp;xmlns:log4j=</span><span class="string">"http://jakarta.apache.org/log4j/"</span><span>&nbsp;debug=</span><span class="string">"false"</span><span>&nbsp;threshold=</span><span class="string">"null"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&lt;appender&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.apache.log4j.ConsoleAppender"</span><span>&nbsp;name=</span><span class="string">"CONSOLE"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;param&nbsp;name=</span><span class="string">"Target"</span><span>&nbsp;value=</span><span class="string">"System.out"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;param&nbsp;name=</span><span class="string">"Threshold"</span><span>&nbsp;value=</span><span class="string">"INFO"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;layout&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.apache.log4j.PatternLayout"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;param&nbsp;name=</span><span class="string">"ConversionPattern"</span><span>&nbsp;value=</span><span class="string">"%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp;"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;/layout&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&lt;filter&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.apache.log4j.varia.DenyAllFilter"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;errorHandler&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.apache.log4j.varia.&nbsp;FallbackErrorHandler"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;/appender&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&lt;appender&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.apache.log4j.FileAppender"</span><span>&nbsp;name=</span><span class="string">"FILE"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;param&nbsp;name=</span><span class="string">"File"</span><span>&nbsp;value=</span><span class="string">"file.log"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;param&nbsp;name=</span><span class="string">"Append"</span><span>&nbsp;value=</span><span class="string">"false"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;param&nbsp;name=</span><span class="string">"Threshold"</span><span>&nbsp;value=</span><span class="string">"INFO"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;layout&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.apache.log4j.PatternLayout"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;param&nbsp;name=</span><span class="string">"ConversionPattern"</span><span>&nbsp;value=</span><span class="string">"%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp;"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;/layout&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&lt;/appender&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&lt;appender&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.apache.log4j.RollingFileAppender"</span><span>&nbsp;name=</span><span class="string">"ROLLING_FILE"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;param&nbsp;name=</span><span class="string">"Threshold"</span><span>&nbsp;value=</span><span class="string">"INFO"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;param&nbsp;name=</span><span class="string">"File"</span><span>&nbsp;value=</span><span class="string">"rolling.log"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;param&nbsp;name=</span><span class="string">"Append"</span><span>&nbsp;value=</span><span class="string">"false"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;param&nbsp;name=</span><span class="string">"MaxFileSize"</span><span>&nbsp;value=</span><span class="string">"10KB"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;param&nbsp;name=</span><span class="string">"MaxBackupIndex"</span><span>&nbsp;value=</span><span class="string">"1"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;layout&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.apache.log4j.PatternLayout"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;param&nbsp;name=</span><span class="string">"ConversionPattern"</span><span>&nbsp;value=</span><span class="string">"%d&nbsp;[%p]&nbsp;-&nbsp;%m%n&nbsp;"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;/layout&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&lt;/appender&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&lt;logger&nbsp;additivity=</span><span class="string">"false"</span><span>&nbsp;name=</span><span class="string">"com.eos"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;level&nbsp;value=</span><span class="string">"info"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;appender-ref&nbsp;ref=</span><span class="string">"CONSOLE"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;/logger&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&lt;category&nbsp;additivity=</span><span class="string">"true"</span><span>&nbsp;name=</span><span class="string">"com.eos.log"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;priority&nbsp;value=</span><span class="string">"warn"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;/category&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&lt;root&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&lt;priority&nbsp;value=</span><span class="string">"info"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class="alt"><span>&lt;appender-ref&nbsp;ref=</span><span class="string">"CONSOLE"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&lt;/root&gt;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&lt;/log4j:configuration&gt;&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<textarea class="java" style="display: none" name="code" rows="15" cols="100">&lt; xml version="1.0" encoding="UTF-8" &gt;
&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;
&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false" threshold="null"&gt;
&lt;appender class="org.apache.log4j.ConsoleAppender" name="CONSOLE"&gt;
&lt;param name="Target" value="System.out"/&gt;
&lt;param name="Threshold" value="INFO"/&gt;
&lt;layout class="org.apache.log4j.PatternLayout"&gt;
&lt;param name="ConversionPattern" value="%d [%p] - %m%n "/&gt;
&lt;/layout&gt;
&lt;filter class="org.apache.log4j.varia.DenyAllFilter"/&gt;
&lt;errorHandler class="org.apache.log4j.varia. FallbackErrorHandler"/&gt;
&lt;/appender&gt;
&lt;appender class="org.apache.log4j.FileAppender" name="FILE"&gt;
&lt;param name="File" value="file.log"/&gt;
&lt;param name="Append" value="false"/&gt;
&lt;param name="Threshold" value="INFO"/&gt;
&lt;layout class="org.apache.log4j.PatternLayout"&gt;
&lt;param name="ConversionPattern" value="%d [%p] - %m%n "/&gt;
&lt;/layout&gt;
&lt;/appender&gt;
&lt;appender class="org.apache.log4j.RollingFileAppender" name="ROLLING_FILE"&gt;
&lt;param name="Threshold" value="INFO"/&gt;
&lt;param name="File" value="rolling.log"/&gt;
&lt;param name="Append" value="false"/&gt;
&lt;param name="MaxFileSize" value="10KB"/&gt;
&lt;param name="MaxBackupIndex" value="1"/&gt;
&lt;layout class="org.apache.log4j.PatternLayout"&gt;
&lt;param name="ConversionPattern" value="%d [%p] - %m%n "/&gt;
&lt;/layout&gt;
&lt;/appender&gt;
&lt;logger additivity="false" name="com.eos"&gt;
&lt;level value="info"/&gt;
&lt;appender-ref ref="CONSOLE"/&gt;
&lt;/logger&gt;
&lt;category additivity="true" name="com.eos.log"&gt;
&lt;priority value="warn"/&gt;
&lt;/category&gt;
&lt;root&gt;
&lt;priority value="info"/&gt;
&lt;appender-ref ref="CONSOLE"/&gt;
&lt;/root&gt;
&lt;/log4j:configuration&gt; </textarea><br />
</LOG4J:CONFIGURATION></priority>
</priority>
</appender-ref></appender-ref></level></category></logger></logger></appender></layout>
<img src ="http://www.blogjava.net/xzclog/aggbug/201844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-05-21 10:35 <a href="http://www.blogjava.net/xzclog/archive/2008/05/21/201844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Log4j进行日志记录</title><link>http://www.blogjava.net/xzclog/archive/2008/05/21/201839.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 21 May 2008 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/05/21/201839.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/201839.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/05/21/201839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/201839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/201839.html</trackback:ping><description><![CDATA[<div><a href="http://www.solol.org/technologic/java/j-log4j/#author">solo L</a></div>
<div class="date">发布日期：2006年07月30日，更新日期：2006年07月30日</div>
<div class="abstract">1996年初，欧洲安全电子市场(EU SEMPER)项目组决定编写自己的日志记录API，后来这个API演变成了Log4j。Log4j是一个开放源码项目，一个非常流行的Java日志记录包。它允许开发者向代码中插入日志记录语句，还允许在不修改应用程序源码的情况下修改记录日志的行为。</div>
<p>1996年初，欧洲安全电子市场(EU SEMPER)项目组决定编写自己的日志记录API，后来这个API演变成了Log4j。Log4j是一个开放源码项目，一个非常流行的Java日志记录包。它允许开发者向代码中插入日志记录语句，还允许在不修改应用程序源码的情况下修改日志记录的行为。</p>
<p>几乎每一个项目都会使用日志记录，但是由于日志记录不是项目的核心，因此受重视的程度一般不是很高。我们认为使用日志记录是一件非常严肃的事情，而且做好使用日志记录的规划比单纯记录日志本身更加重要。</p>
<p>本文将比较全面的阐述Log4j的设计原理和使用方法。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-log4j/#top">回页首</a></div>
<h2><a name="d3e56">日志记录</a></h2>
<p>日志记录记录的是应用程序运行的轨迹。我们可以通过查看这些轨迹来调试应用程序，这可能也是日志记录最为流行的用法了。但是我们必须意识到规划良好的日志记录中还含有丰富的信息，通过手工的方式或借助一些工具(大多数时候需要自己来书写这些工具)来分析挖掘这些信息。</p>
<p>例如，如果我们在规划中指出必须记录用户的每一次操作，记录的样式为 [日志信息]-[操作开始的时间]-[日志级别]-[日志类别]-[用户名]-[操作名]-[消息]，这只是我们假设的一种样式，实际的日志中一般会含有比这更加丰富的信息。为了更好的理解，我们根据该样式构造了一些日志记录(其中日志类别org.solol.Main、org.solol.Parser和org.solol.UserOperator使用了不同的样式)：</p>
<pre>[日志信息]-[2006-07-30 08:54:20]-[INFO]-[org.solol.Main]-[具体的消息]
[日志信息]-[2006-07-30 08:55:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表1]-[具体的消息]
[日志信息]-[2006-07-30 08:55:30]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表2]-[具体的消息]
[日志信息]-[2006-07-30 08:56:01]-[INFO]-[org.solol.Parser]-[具体的消息]
[日志信息]-[2006-07-30 08:57:26]-[INFO]-[org.solol.UserOperator]-[User2]-[添加用户User3]-[具体的消息]
[日志信息]-[2006-07-30 08:58:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表3]-[具体的消息]
[日志信息]-[2006-07-30 08:59:38]-[INFO]-[org.solol.UserOperator]-[User3]-[查询报表1]-[具体的消息]
[日志信息]-[2006-07-30 08:59:39]-[INFO]-[org.solol.UserOperator]-[User2]-[退出系统]-[具体的消息]
</pre>
<p>从上面的日志记录中我们很容易抽取出某一用户的操作列表，如对于用户User1我们的结果为：</p>
<pre>[日志信息]-[2006-07-30 08:55:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表1]-[具体的消息]
[日志信息]-[2006-07-30 08:55:30]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表2]-[具体的消息]
[日志信息]-[2006-07-30 08:58:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表3]-[具体的消息]
</pre>
<p>这样我们就得到了某一时间段中User1的操作列表，可以利用这一列表来进行安全分析。</p>
<p>我们还可以从另外的角度来分析上面的日志记录，如我们很容易统计出操作(日志类别为org.solol.UserOperator)发生的总次数(6次)，其中操作[查询报表1]为2次，[查询报表2]为1次，[查询报表3]为1次，[添加用户User3]为1次，[退出系统]为1次。这样我们就可以得出系统中的那些操作用户使用的比较频繁。</p>
<p>以上我们从两个角度对日记记录中的信息进行了简单的挖掘，实际中待挖掘的方面要丰富的多，这取决于您的意图和您的想象力。</p>
<p>这里我们还要特别强调一下：<strong>所有这一切都需要有使用日志记录的良好规划</strong>。如果规划不好(即日志记录没有规律性)，那么我们挖掘时的任务就会非常繁重或者使挖掘成为一个不可能的任务。 </p>
<p>文章到了这里我们要来描述日志记录的最为流行的用法了，即调试应用程序。我们在调试应用程序时一般会使用两种方法，除了日志记录之外，还有debugger调试器。</p>
<p>我们不想把他们放到一起来描述，因为这是两个完全不同的问题，虽然他们都用来调试应用程序。使用debugger调试器我们可以清楚的知道引发错误的上下文及其相关信息，也可以使用单步执行、设置断点、检查变量以及暂挂和恢复线程等等比较高级的能力，但是尽管这样它也不能替代日志记录，同样日志记录也不能替代debugger调试器。我们要结合使用这两种方法，不同的场景使用不同的方法会有更好的效果。</p>
<p>我们认为使用日志记录来调试应用程也应该充分考虑软件的开发周期。这里我们只考虑软件开发周期中的与日志记录有关的两个阶段：</p>
<ul>
    <li>开发阶段，用来记录应用程序的方方面面和各种细节，非常详细，使得一看到它就知道那里出了问题，出了什么样的问题。
    <li>出品阶段，要能够记录各种级别的错误和警告，同时也要适度记录应用程序正常运行的关键信息，这些信息可以给相关人员(开发人员、测试人员、用户等)极大的信心，使他们可以毫不犹豫的告诉您--瞧我们的软件在正常的运行。如一个好的web服务器的启动日志记录不仅要包含错误和警告，还要包含服务器正在启动，正在加载某某组件等等，最后还要提示启动是成功还是失败。 </li>
</ul>
<p>阅读到这里我们就应该着手实现我们的日志记录了。比较幸运的是我们有好多日志记录软件包可选，这就使我们不必关心日志记录的细节，只要把主要的精力放到日志记录的规划上就好了。我们选择的是Log4j，文章的余下部分将主要介绍这个Java日志记录软件包。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-log4j/#top">回页首</a></div>
<h2><a name="d3e115">log4j的特性</a></h2>
<p>log4j的特性列表：</p>
<ul>
    <li>在运行速度方面进行了优化
    <li>使用基于名称的日志(logger)层次结构
    <li>是fail-stop的
    <li>是线程安全的
    <li>不受限于预定义的实用工具集
    <li>可以在运行时使用property和xml两种格式的文件来配置日志记录的行为
    <li>在一开始就设计为能够处理Java异常
    <li>能够定向输出到文件(file)、控制台(console)、java.io.OutputStream、java.io.Writer、远程服务器、远程Unix Syslog守护者、远程JMS监听者、NT EventLog或者发送e-mail
    <li>使用DEBUG、INFO、WARN、ERROR和FATAL五5个级别
    <li>可以容易的改变日志记录的布局(Layout)
    <li>输出日志记录的目的地和写策略可以通过实现Appender接口来改变
    <li>支持为每个日志(logger)附加多个目的地(appender)
    <li>提供国际化支持 </li>
</ul>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-log4j/#top">回页首</a></div>
<h2><a name="d3e169">log4j的设计原理</a></h2>
<p>Log4j有三个主要的组件：Logger、Appender和Layout。这三个组件相互配合使得我们可以获得非常强大的日志记录的能力。</p>
<h2><a name="d3e178">Logger</a></h2>
<p>Logger的名称是区分大小写的，依据名称可以确定其层次结构(即父子关系)，规则如下：</p>
<ul>
    <li>如果Logger A的名称后跟一个点(.)是Logger B的名称的前缀就认为Logger A是Logger B的祖先。
    <li>如果在Logger A和Logger B之间，Logger B没有任何其它的祖先就认为Logger A是Logger B的父亲。 </li>
</ul>
<p>在Logger的层次结构的最顶层是root logger，它会永远存在，而且不能通过名字取到。</p>
<p>上面文字的描述可能不好的理解，为此我们给出了一张图，Logger的层次结构图，从中可以非常直观的看出三种主要组件的关系和各自所起的作用。</p>
<p>
<div>图示 1. Logger的层次结构图</div>
<img height="533" alt="Logger的层次结构图" src="http://www.solol.org/technologic/java/j-log4j/hierarchy.gif" width="701" />
<p>&nbsp;</p>
<p>Loger x.y是Logger x.y.z的祖先，因为x.y.是x.y.z的前缀，这符合规则的前一条。另外在Logger x.y和Logger x.y.z之间，Logger x.y.z没有其它的祖先，因此Logger x.y是Logger x.y.z的父亲，这符合规则的后一条。这样我们依据上面的规则就可以构造出如图1所示的Logger的层次结构。</p>
<p>从图1中我们还可以看到每一个Logger都有一个Level，根据该Level的值Logger决定是否处理对应的日志请求。如果Level没有被设置，就象图1中的Logger x.y一样，又该怎么办呢？答案是可以从祖先那里继承。</p>
<p>如果Logger C没有被设置Level，那么它将沿着它的层次结构向上查找,如果找到就继承并结束，否则会一直查找到root logger结束。因为log4j在设计时保证root logger会被设置一个默认的Level,所以任何logger都可以继承到Level。</p>
<p>图1中的Logger x.y没有被设置Level，但是根据上面的继承规则，Logger x.y继承了root logger的Level。</p>
<p>我们在来看看Logger选择日志记录请求(log request)的规则：</p>
<p>假设Logger M具有q级的Level，这个Level可能是设置的也可能是继承到的。</p>
<p>如果向Logger M发出一个Level为p的日志记录请求，那么只有满足p&gt;=q时这个日志记录请求才会被处理。</p>
<p>org.apache.log4j.Logger中的不同方法发出不同Level的日志记录请求，如下：</p>
<ul>
    <li>public void debug(Object message)，发出Level为DEBUG的日志记录请求
    <li>public void info(Object message)，发出Level为INFO的日志记录请求
    <li>public void warn(Object message)，发出Level为WARN的日志记录请求
    <li>public void error(Object message)，发出Level为ERROR日志记录请求
    <li>public void fatal(Object message)，发出Level为FATAL的日志请求
    <li>public void log(Level l, Object message)，发出指定Level的日志记录请求 </li>
</ul>
<p>其中的静态常量DEBUG、INFO、WARN、ERROR、FATAL是在org.apache.log4j.Level中定义的，除了使用这些预定义的Level之外，Log4j还支持自定义Level。</p>
<p>注：org.apache.log4j.Level中还预定义了一些其它的Level。</p>
<h2><a name="d3e264">Appender</a></h2>
<p>在Log4j中，Appender指的是日志记录输出的目的地。当前支持的Appender(目的地)有文件(file)、控制台(console)、java.io.OutputStream、java.io.Writer、远程服务器、远程Unix Syslog守护者、远程JMS监听者、NT EventLog或者发送e-mail。如果您在上面没有找到适合的Appender，那就需要考虑实现自己的自定义Appender了。 </p>
<p>每个Logger可以有多个Appender，但是相同的Appender只会被添加一次。</p>
<p>Appender的附加性意味着Logger C会将日志记录发给它的和它祖先的所有Appender。在图1中Logger a会将日志记录发给它自己的JDBCAppender和它的祖先root logger的ConsoleAppender和FileAppender。Logger x.y.z自己没有Appender，它将把日志记录发给它的祖先root logger的ConsoleAppender和FileAppender，如果Logger x.y也含有Appender，那么它们也会包括在内。 </p>
<p>Appender的附加性是可以被中断的。假设Logger C的一个祖先为Logger P，如果Logger P的附加性标志(additivity flag)设置为假，那么Logger C会将日志记录只发给它的和在它和Logger P之间的祖先(包括Logger P)的Appender，而不会发给Logger P的祖先的Appender。Logger的附加性标志(additivity flag)默认值为ture。 </p>
<p>在图1中如果没有设置Logger a的附加性标志(additivity flag)，而是使用默认值true，那么Logger a会将日志记录发给它自己的JDBCAppender和它祖先root logger的ConsoleAppender和FileAppender，这和上面的描述相同。如果设置Logger a的附加性标志(additivity flag)的值false，那么Logger a会将日志记录发给它自己的JDBCAppender而不会在发给它祖先root logger的ConsoleAppender和FileAppender了。 </p>
<h2><a name="d3e286">Layout</a></h2>
<p>Appender定制了输出目的地，通常我们还需要定制日志记录的输出格式,在Log4j中是通过将Layout和Appender关联到一起来实现的。Layout依据用户的要求来格式化日志记录。PatternLayout(标准Log4j组件)让用户依据类似于C语言printf函数的转换模式来指定输出格式。 </p>
<p>例如，转换模式(conversion pattern)为"%r [%t] %-5p %c - %m%n"的PatternLayout将生成类似于以下内容的输出：</p>
<pre>176 [main] INFO  org.foo.Bar - Located nearest gas station.
</pre>
<p>在上面的输出中：</p>
<ul>
    <li>第一个字段表示自程序开始到发出日志记录请求时所消耗的毫秒数
    <li>第二个字段表示发出日志记录请求的线程
    <li>第三个字段表示日志记录请求的Level
    <li>第四个字段表示发出日志记录请求的Logger的名称
    <li>第五个字段(-后的文本)表示日志记录请求的消息 </li>
</ul>
<p>Log4j中还提到了一些其它的Layout，包括HTMLLayout、SimpleLayout、XMLLayout、TTCCLayout和DateLayout。如果这些不能满足您的要求，还可以自定义自己的Layout。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-log4j/#top">回页首</a></div>
<h2><a name="d3e326">log4j的配置</a></h2>
<p>依据既有的经验显示用于日志记录的代码大约是全部代码量的4%。如果应用程序具有一定的规模，日志记录语句的数量还是比较巨大的，因此必须有效的管理这些语句。</p>
<p>在Log4j中我们可以通过配置Log4j环境来有效的管理日志记录。配置的方式有三种：</p>
<ul>
    <li>通过程序配置
    <li>通过Property文件配置
    <li>通过XML文件配置 </li>
</ul>
<h2><a name="d3e350">程序配置</a></h2>
<p>通过程序配置Log4j环境实际上就是在应用程序的代码中改变Logger的Level或增加减少Appender等等。</p>
<p>Log4j提供了BasicConfigurator，它只是为root logger添加Appender。其中，</p>
<ul>
    <li>BasicConfigurator.configure()为root logger添加一个关联着PatternLayout.TTCC_CONVERSION_PATTERN的ConsoleAppender
    <li>BasicConfigurator.configure(Appender appender)为root logger添加指定的Appender </li>
</ul>
<p>我们可以把BasicConfigurator看成是一个简单的使用程序配置Log4j环境的示例。例如，要给root logger添加两个Appender(A和B)，下面的代码分别完成了这个要求。</p>
<p>不使用BasicConfigurator：</p>
<pre>//示例代码，不能直接使用
Logger root = Logger.getRootLogger();
root.addAppender(A);
root.addAppender(B);
</pre>
<p>使用BasicConfigurator：</p>
<pre>//示例代码，不能直接使用
BasicConfigurator.configure(A);
BasicConfigurator.configure(B);
</pre>
<h2><a name="d3e388">Property文件配置</a></h2>
<p>这里要使用PropertyConfigurator来分析配置文件并设置日志记录，但是要注意日志记录先前的配置不会被清除和重设。 </p>
<p>Property文件是由key=value这样的键值对所组成的，可以使用#或!作为注释行的开始。下面给出了两个简单的示例：</p>
<p>非常简单的示例1：</p>
<pre>log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
</pre>
<p>稍显复杂的示例2：</p>
<pre>log4j.rootLogger=, A1, A2
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
log4j.appender.A2=org.apache.log4j.FileAppender
log4j.appender.A2.File=filename.log
log4j.appender.A2.Append=false
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-5r %-5p [%t] %c{2} - %m%n
</pre>
<p>上面的两个示例只是让您对配置文件的格式有一个大体的认识，我们将在后面详细的描述各个配置元素的语法。</p>
<p>Repository-wide threshold：</p>
<p>Repository-wide threshold指定的Level的优先级高于Logger本身的Level。语法为log4j.threshold=[level]，level可以为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。也可以使用自定义Level，这时的语法为log4j.threshold=[level#classname]。默认为ALL。</p>
<p>依据上面的规则，我们有这样的结论：如果log4j.threshold=ERROR，Logger C的Level=DEBUG，这时只有高于等于ERROR的日志记录请求会被Logger C处理。</p>
<p>Appender的配置：</p>
<p>Appender的配置语法为</p>
<pre># For appender named appenderName, set its class.
# Note: The appender name can contain dots.
log4j.appender.appenderName=fully.qualified.name.of.appender.class
# Set appender specific options.
log4j.appender.appenderName.option1=value1
...
log4j.appender.appenderName.optionN=valueN
#For each named appender you can configure its Layout.
#The syntax for configuring an appender's layout is:
log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1=value1
....
log4j.appender.appenderName.layout.optionN=valueN
</pre>
<p>Logger的配置：</p>
<p>root logger的配置语法：</p>
<p>log4j.rootLogger=[level], appenderName, appenderName, ...，其中level可以为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。也可以使用自定义Level，这时的语法为[level#classname]。</p>
<p>如果Level被指定那么root logger的Level将被配置为指定值。如果Level没有被指定那么root logger的Level不会被修改。从上面的语法中我们可以看出通过用,分隔的列表可以为root logger指定多个Appender。</p>
<p>对于root logger之外的logger语法是相似的，为log4j.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...</p>
<p>上面只有INHERITED和NULL需要说明一下，其它部分和root logger相同。INHERITED和NULL的意义是相同的。如果我们使用了它们，意味着这个logger将不在使用自己的Level而是从它的祖先那里继承。</p>
<p>Logger的附加性标志(additivity flag)可以使用log4j.additivity.logger_name=[false|true]来配置。</p>
<p>ObjectRenderer配置：</p>
<p>我们可以通过ObjectRenderer来定义将消息对象转换成字符串的方式。语法为log4j.renderer.fully.qualified.name.of.rendered.class=fully.qualified.name.of.rendering.class。如：</p>
<pre>//my.Fruit类型的消息对象将由my.FruitRenderer转换成字符串
log4j.renderer.my.Fruit=my.FruitRenderer
</pre>
<p>对上面的各个配置元素的语法理解之后，在来看示例1和2就很容易了。</p>
<p>PropertyConfigurator不支持Filter的配置。如果要支持Filter您可以使用DOMConfigurator，即使用XML文件的方式配置。</p>
<h2><a name="d3e473">XML文件配置</a></h2>
<p>要使用DOMConfigurator.configure()来读取XML格式的配置文件。XML文件格式的定义是通过org/apache/log4j/xml/log4j.dtd来完成的，各个配置元素的嵌套关系如下：</p>
<pre>&lt;!ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?,categoryFactory?)&gt;
</pre>
<p>这里没有给出更为详细的内容，要了解详细的内容需要查阅log4j.dtd。</p>
<p>下面这个简单的示例可以使您对XML配置文件的格式有一个基本的认识：</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;!DOCTYPE log4j SYSTEM "log4j.dtd"&gt;
&lt;log4j&gt;
&lt;appender name="A1" class="org.apache.log4j.FileAppender"&gt;
&lt;layout class="org.apache.log4j.PatternLayout"&gt;
&lt;param name="ConversionPattern" value="%-5p %c{2} - %m\n"/&gt;
&lt;/layout&gt;
&lt;/appender&gt;
&lt;appender name="A2" class="org.apache.log4j.FileAppender"&gt;
&lt;layout class="org.apache.log4j.TTCCLayout"&gt;
&lt;param name="DateFormat" value="ISO8601" /&gt;
&lt;/layout&gt;
&lt;param name="File" value="warning.log" /&gt;
&lt;param name="Append" value="false" /&gt;
&lt;/appender&gt;
&lt;category name="org.apache.log4j.xml" priority="debug"&gt;
&lt;appender-ref ref="A1" /&gt;
&lt;/category&gt;
&lt;root priority="debug"&gt;
&lt;appender-ref ref="A1" /&gt;
&lt;appender-ref ref="A2" /&gt;
&lt;/root&gt;
&lt;/log4j&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-log4j/#top">回页首</a></div>
<h2><a name="d3e494">默认初始化过程</a></h2>
<p>默认初始化过程在LogManager类的静态初始化器中完成。具体步骤如下：</p>
<ul>
    <li>检查系统属性log4j.defaultInitOverride，如果值为false则执行初始化过程，否则跳过初始化过程。
    <li>将系统属性log4j.configuration的值赋给变量resource。如果log4j.configuration没有被定义则使用默认值log4j.properties。
    <li>试图转换变量resource到一个url。
    <li>如果变量resource不能转换成一个url，那么将使用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)得到一个url。
    <li>如果还是得不到url，将忽略默认初始化过程。如果得到url将使用PropertyConfigurator或DOMConfigurator来配置，也可以使用自定义的XXXConfigurator。 </li>
</ul>
<div><a name="resource">参考资料</a>
<ul>
    <li><a title="图解 Tomcat 体系结构" href="http://www.solol.org/technologic/java/j-tomcatarch/">图解 Tomcat 体系结构</a>
    <li><a href="http://logging.apache.org/">Apache Log4j</a>项目主页
    <li><a href="http://logging.apache.org/log4j/docs/documentation.html">Log4j Documentation</a>，这里的资源非常的丰富。 </li>
</ul>
</div>
<div>
<div><a name="author">关于作者</a></div>
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#111;&#108;&#111;&#95;&#108;&#64;&#101;&#121;&#111;&#117;&#46;&#99;&#111;&#109;&#63;&#99;&#99;&#61;&#115;&#111;&#108;&#111;&#46;&#108;&#32;&#97;&#116;&#32;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">solo L</a> 一位有些理想主义的软件工程师，创建了<a href="http://www.solol.org/">solol.org</a>。他常常在<a href="http://www.solol.org/blogs/">这里</a>发表一些对技术的见解。 <br />
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/201839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-05-21 10:20 <a href="http://www.blogjava.net/xzclog/archive/2008/05/21/201839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Commons 阅读笔记 之 Logging 篇</title><link>http://www.blogjava.net/xzclog/archive/2006/09/04/67482.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sun, 03 Sep 2006 16:48:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2006/09/04/67482.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/67482.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2006/09/04/67482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/67482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/67482.html</trackback:ping><description><![CDATA[
		<div class="center">
				<h4>摘要:</h4>本文描述了apache commons中的commons loggings部分，Commons Logging和Log4J用来提供日志支持。 <br /></div>
		<!-- end of summary line -->
		<div class="overflow" id="text">
				<b>介绍</b>
				<br />命令行参数解析、应用程序配置和日志记录，作为一个应用程序的骨架，随处可见。因此，Apache软件组织开发出了一套通用的类库，用来帮助软件开发人员完成这些“骨架”的建立。其中：<br />&amp;#8226;Commons CLI用于命令行解析<br />&amp;#8226;Commons Configuration用于读取properties格式或者XML格式的配置信息<br />&amp;#8226;Commons Logging和Log4J用来提供日志支持。<br />这些通用的类库都在http://jakarta.apache.org/commons/index.html网址上提供下载<br /><br />Apache组织开发了一套用于支持Logging的Log4J，Java 1.4版本也引入了一套内置的Logging框架，如果开发者想在这两套Logging系统之间自由的切换，该怎么办呢？答案就是，使用Commons Logging。Commons Logging定义了一套抽象的Logging接口，用户可以通过配置，使这些接口指向任何一个已存在的Logging系统。<br /><br /><b>&amp;#8226;使用抽象Logging接口</b><br />问题：<br />你在编写一个可以重复使用的库，需要写入Log信息，但你不想使你的Logging功能绑定在Apache Log4J或者JDK 1.4 Logging框架上。<br />解决方案：<br /><pre class="overflow"><br />public static void main(String［］ args) {//自己替换［］<br /><br />  System.setProperty("org.apache.commons.logging.Log",<br />      "org.apache.commons.logging.impl.Jdk14Logger");<br />  Log log = LogFactory.getLog("com.discursive.jccook.SomeApp");<br /><br />  if (log.isTraceEnabled()) {<br />    log.trace("This is a trace message");<br />  }<br /><br />  if (log.isDebugEnabled()) {<br />    log.debug("This is a debug message");<br />  }<br /><br />  log.info("This is an informational message");<br />  log.warn("This is a warning");<br />  log.error("This is an error");<br />  log.fatal("This is fatal");<br /><br />}<br /></pre><br />LogFactory.getLog方法会根据底层环境返回一个适当的Log实现。如果用户想指定一个具体的Logging系统实现，可以设置org.apache.commons.logging.Log系统属性。例如：<br />System.setProperty("org.apache.commons.logging.Log",<br />"org.apache.commons.logging.impl.Log4JLogger");<br />这样就会使用Log4J作为Logging系统。<br />org.apache.commons.logging.Log可以设定为：<br />&amp;#8226;org.apache.commons.logging.impl.Log4JLogger  使用Log4J<br />&amp;#8226;org.apache.commons.logging.impl.Jdk14Logger  使用JDK 1.4 Logging框架<br />&amp;#8226;org.apache.commons.logging.impl.SimpleLog  使用Commons Logging内置的简单Log实现<br />其他：<br />总结一下，Commons Logging会按照下列顺序来指定具体的Log实现。<br />&amp;#8226;如果定义了org.apache.commons.logging.Log系统参数，实用指定的Logging实现。<br />&amp;#8226;如果在CLASSPATH里发现了Log4J，使用Log4J。<br />&amp;#8226;如果使用的是JDK1.4，使用JDK1.4内置的Logging框架。<br />&amp;#8226;如果都没有找到，则使用Commons Logging内置的简单Log实现。<br /><br /><br /><a href="http://www.msbai.net/read.php/29.htm"><font color="#8d866d"><strong>Jakarta Commons Logging学习笔记 转载</strong></font></a><font color="#8d866d"><strong><br /><br /></strong>1、Commons-Loggin简介<br /><br />　　Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface)，同时兼顾轻量级和不依赖于具体的日志实现工具。 它提供给中间件/日志工具开发者一个简单的日志操作抽象，允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口，对其它一些日志工具，包括Log4J, Avalon LogKit, and JDK 1.4等，进行了简单的包装，此接口更接近于Log4J和LogKit的实现. <br /><br />2、快速入门<br /><br />　　JCL有两个基本的抽象类：Log(基本记录器)和LogFactory(负责创建Log实例)。当commons-logging.jar被加入到CLASSPATH之后，它会心可能合理地猜测你喜欢的日志工具，然后进行自我设置，用户根本不需要做任何设置。默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的（按照顺序，寻找过程会在找到第一个工具时中止）:<br /><br />寻找当前factory中名叫org.apache.commons.logging.Log配置属性的值<br /><br />寻找系统中属性中名叫org.apache.commons.logging.Log的值<br /><br />如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)<br /><br />如果应用程序运行在jdk1.4的系统中，使用相关的包装类(Jdk14Logger)<br /><br />使用简易日志包装类(SimpleLog)<br /><br /><br />3、开发使用logging<br /><br /><br />//在程序文件头部import相关的类<br />import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />......<br />//在类中获取一个实例<br />public class MYCLASS<br />{<br />private static Log log = LogFactory.getLog(MyCLASS.class);<br />...<br />　}<br /><br />日志信息被送往记录器，如上例中的log。这个发送过程，是通过调用Log接口中定义的方法完成的，不同方法跟不同的级别联系在一起，日志信息通过哪个级别的方法发送，就标明了日志信息的级别。org.apache.commons.logging.Log接口中定义的方法,按严重性由高到低的顺序有：<br /><br /><br />log.fatal(Object message); <br /><br />log.fatal(Object message, Throwable t);<br /><br />log.error(Object message); <br /><br />log.error(Object message, Throwable t);<br /><br />log.warn(Object message); <br /><br />log.warn(Object message, Throwable t); <br /><br />log.info(Object message); <br /><br />log.info(Object message, Throwable t); <br /><br />log.debug(Object message); <br /><br />log.debug(Object message, Throwable t);<br /><br />log.trace(Object message); <br /><br />log.trace(Object message, Throwable t);<br />除此以外，还提供下列方法以便代码保护.<br /><br />log.isFatalEnabled();<br /><br />log.isErrorEnabled();<br /><br />log.isWarnEnabled(); <br /><br />log.isInfoEnabled(); <br /><br />log.isDebugEnabled();<br /><br />log.isTraceEnabled();<br /><br />　　信息级别<br />　　确保日志信息在内容上和反应问题的严重程度上的恰当，是非常重要的。<br /><br />fatal非常严重的错误，导致系统中止。期望这类信息能立即显示在状态控制台上。<br /><br />error其它运行期错误或不是预期的条件。期望这类信息能立即显示在状态控制台上。<br /><br />warn使用了不赞成使用的API、非常拙劣使用API, '几乎就是'错误, 其它运行时不合需要和不合预期的状态但还没必要称为 "错误"。期望这类信息能立即显示在状态控制台上。<br /><br />info运行时产生的有意义的事件。期望这类信息能立即显示在状态控制台上。<br /><br />debug系统流程中的细节信息。期望这类信息仅被写入log文件中。<br /><br />trace更加细节的信息。期望这类信息仅被写入log文件中。<br /><br />通常情况下，记录器的级别不应低于info.也就是说，通常情况下debug的信息不应被写入log文件中。<br />　　工作机理<br /><br />生命周期<br />JCL LogFactory必须实现建立/断开到日志工具的连接，实例化/初始化/解构一个日志工具.<br /><br />异常处理<br />JCL Log 接口没有指定任何异常处理,对接口的实现必须捕获并处理异常。<br /><br /><br />多线程<br />JCL Log 和 LogFactory 的实现，必须确保任何日志工具对并行的要求.<br /><br /><br />　　记录器的设置<br />　　JCL采用的记录器的不同其设置内容也不同。Log4J是默认首选记录器，对其设置可通过系统属性(system properties)或一个属性文件进行设置，下面是其设置参数。<br />&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;参数&lt;/td&gt;&lt;td&gt;值域&lt;/td&gt;&lt;td&gt;默认值&lt;/td&gt;&lt;td&gt;说明&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;log4j.configuration&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;log4j.properties&lt;/td&gt;&lt;td&gt;指定配置文件的名字&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;log4j.rootCategory&lt;/td&gt;&lt;td&gt;priority [, appender]*&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;设定根记录器的级别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;log4j.logger&amp;lt;.logger.name&amp;gt;&lt;/td&gt;&lt;td&gt;DEBUG, INFO, WARN, ERROR, or FATAL&lt;/td&gt;&lt;td&gt;设定logger.name这个记录器的级别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;log4j.appender&amp;lt;.appender&amp;gt;.Threshold&lt;/td&gt;&lt;td&gt;priority&lt;/td&gt;&lt;td&gt;指定记录设备appender(console, files, sockets, and others)的最低级别。&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;<!-- Added by RelatedTopic, plugin for Bo-Blog 2.0.0 --></font></div>
<img src ="http://www.blogjava.net/xzclog/aggbug/67482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2006-09-04 00:48 <a href="http://www.blogjava.net/xzclog/archive/2006/09/04/67482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4j基本使用方法</title><link>http://www.blogjava.net/xzclog/archive/2006/09/04/67481.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sun, 03 Sep 2006 16:42:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2006/09/04/67481.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/67481.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2006/09/04/67481.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/67481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/67481.html</trackback:ping><description><![CDATA[Log4j由三个重要的组件构成：日志信息的优先级，日志信息的输出目的地，日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG，分别用来指定这条日志信息的重要程度；日志信息的输出目的地指定了日志将打印到控制台还是文件中；而输出格式则控制了日志信息的显示内容。 
<p>　　<strong>一、定义配置文件</strong></p><p>　　其实您也可以完全不使用配置文件，而是在代码中配置Log4j环境。但是，使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件（键=值）。下面我们介绍使用Java特性文件做为配置文件的方法：</p><p>　　1.配置根Logger，其语法为：</p><p>　　log4j.rootLogger = [ level ] , appenderName, appenderName, … </p><p>　　其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 </p><p>　　2.配置日志信息输出目的地Appender，其语法为：</p><p>　　log4j.appender.appenderName = fully.qualified.name.of.appender.class <br />　　log4j.appender.appenderName.option1 = value1 <br />　　… <br />　　log4j.appender.appenderName.option = valueN </p><p>　　其中，Log4j提供的appender有以下几种： <br />　　org.apache.log4j.ConsoleAppender（控制台）， <br />　　org.apache.log4j.FileAppender（文件）， <br />　　org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />　　org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）， <br />　　org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） </p><p>　　3.配置日志信息的格式（布局），其语法为：</p><p>　　log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class <br />　　log4j.appender.appenderName.layout.option1 = value1 <br />　　… <br />　　log4j.appender.appenderName.layout.option = valueN </p><p>　　其中，Log4j提供的layout有以下几种： <br />　　org.apache.log4j.HTMLLayout（以HTML表格形式布局）， <br />　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式）， <br />　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串）， <br />　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </p><blockquote dir="ltr" style="MARGIN-RIGHT: 0px"><p><font color="#ffa500">Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下：<br />%m 输出代码中指定的消息<br />%n  输出一个回车换行符，Windows平台为“\r\n”，Unix平台为“\n” <br />%p  输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL <br />%r   输出自应用启动到输出该log信息耗费的毫秒数 <br />%c  输出所属的类目，通常就是所在类的全名 <br />%t   输出产生该日志事件的线程名<br />%d  输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，<br />        比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921 <br />%l   输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。<br />        举例：Testlog4.main(TestLog4.java:10)<br />%F  类目名<br />%L  代码中的行数<br /></font></p></blockquote><p>　　<strong>二、在代码中使用Log4j</strong></p><p>　　1.得到记录器</p><p>　　使用Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为： </p><p>　　public static Logger getLogger( String name) </p><p>　　通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如： </p><p>　　static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )</p><p>　　2.读取配置文件 </p><p>　　当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：</p><p>　　BasicConfigurator.configure ()： 自动快速地使用缺省Log4j环境。<br />　　PropertyConfigurator.configure ( String configFilename) ：读取使用Java的特性文件编写的配置文件。<br />　　DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。</p><p>　　3.插入记录信息（格式化日志信息）</p><p>　　当上两个必要步骤执行完毕，您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：</p><p>　　Logger.debug ( Object message ) ;<br />　　Logger.info ( Object message ) ;<br />　　Logger.warn ( Object message ) ;<br />　　Logger.error ( Object message ) ;<br /><br /><br /><strong>介绍<br /></strong>命令行参数解析、应用程序配置和日志记录，作为一个应用程序的骨架，随处可见。因此，Apache软件组织开发出了一套通用的类库，用来帮助软件开发人员完成这些“骨架”的建立。其中：<br />&amp;#8226;Commons CLI用于命令行解析<br />&amp;#8226;Commons Configuration用于读取properties格式或者XML格式的配置信息<br />&amp;#8226;Commons Logging和Log4J用来提供日志支持。<br />这些通用的类库都在http://jakarta.apache.org/commons/index.html网址上提供下载<br /><br />Log4J是一个高度可配置的Logging框架，提供了结构化，多种目标和格式支持。<br /><br /><b>&amp;#8226;配置Log4J</b><br />问题：<br />Log4J支持Properties和XML两种格式的配置文件。<br />解决方案：<br /><font color="#ffa500">定义log4j.properties配置文件</font><br /><br /><font color="#ffa500"># 所有Log信息输出到标准输出(System.out)和在下面指定的一个文件<br /># WARN是默认的logging级别<br />log4j.rootCategory = WARN, STDOUT, FILE<br /><br /># 应用程序的logging级别是DEBUG<br />log4j.logger.com.discursive = DEBUG<br /><br /># 配置标准输出Appender<br />log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender<br />log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout<br />log4j.appender.STDOUT.layout.ConversionPattern = %5p (%F:%L) %m%n<br /><br /># 配置输出文件Appender<br />log4j.appender.FILE = org.apache.log4j.RollingFileAppender<br />log4j.appender.FILE.File = output.log<br />log4j.appender.FILE.MaxFileSize = 2000KB<br />log4j.appender.FILE.MaxBackupIndex = 5<br />log4j.appender.FILE.layout = org.apache.log4j.PatternLayout<br />log4j.appender.FILE.layout.ConversionPattern = %d %-5p %c - %m%n<br /></font></p><p><br /></p><pre class="overflow"><br />PropertyConfigurator.configure(getClass()<br />  .getResource("/resources/log4j.properties"));<br /><br />Logger logger = Logger.getLogger("com.discursive.SomeApp");<br />logger.info("This is a info message");<br />logger.error("This is a error message");<br /></pre><p><br />使用BasicConfigurator类来加载log4j.properties配置。使用Logger.getLogger获得一个logger实例。<br />配置文件中的rootCategory指定将log输出到控制台和output.log文件。文件Appender使用了RollingFileAppender，当文件大小达到最大文件大小(MaxFileSize)2000KB时，RollingFileAppender会备份原log文件，并再创建一个新的log文件。<br />配置文件指定默认的logging级别是DEBUG(log4j.logger.com.discursive = DEBUG)。所以，所有级别低于DEBUG的log信息都不会被输出。Log4J按重要度定义了五个log级别，分别是：DEBUG, INFO, WARN, ERROR, 和FATAL。<br />其他：<br />Log4J还可以使用XML格式的配置文件，使用DOMConfigurator读取。<br />Log4J使用Appender和Layout来定制log输出。Appender指定输出到何处，Layout指定如何输出(输出的格式)。<br />Log4J内置的Appender有：<br />&amp;#8226;SMTPAppender<br />&amp;#8226;RollingFileAppender<br />&amp;#8226;SocketAppender<br />&amp;#8226;SyslogAppender<br />&amp;#8226;NTEventLogAppender<br />Log4J支持的Layout有<br />&amp;#8226;XMLLayout<br />&amp;#8226;PatternLayout<br />&amp;#8226;HTMLLayout<br />&amp;#8226;DateLayout.<br /><br /><br /><font color="#ff0000">附1<br /># 所有Log信息输出到标准输出(System.out)和在下面指定的一个文件<br /># WARN是默认的logging级别<br />log4j.rootCategory = INFO, STDOUT<br />#log4j.rootCategory = INFO, STDOUT, FILE</font></p><p><font color="#ff0000"># 配置标准输出Appender<br />log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender<br />log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout<br />log4j.appender.STDOUT.layout.ConversionPattern = %d{ABSOLUTE} %-5p [%c:%L] %m%n</font></p><p><font color="#ff0000"># 配置输出文件Appender<br />log4j.appender.FILE = org.apache.log4j.RollingFileAppender<br />log4j.appender.FILE.File = output.log<br />log4j.appender.FILE.MaxFileSize = 2000KB<br />log4j.appender.FILE.MaxBackupIndex = 5<br />log4j.appender.FILE.layout = org.apache.log4j.PatternLayout<br />log4j.appender.FILE.layout.ConversionPattern = %d %-5p [%c:%L] %m%n</font></p><p><font color="#ff0000"># 应用程序的logging级别是DEBUG<br />log4j.logger.com.xzc = DEBUG<br /><br /><br />附2<br />### direct log messages to stdout ###<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 - &lt;%m&gt;%n</font></p><p><font color="#ff0000">### direct messages to file hibernate.log ###<br />#log4j.appender.file=org.apache.log4j.FileAppender<br />#log4j.appender.file.File=hibernate.log<br />#log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n</font></p><p><font color="#ff0000">### set log levels - for more verbose logging change 'info' to 'debug' ###</font></p><p><font color="#ff0000">log4j.rootLogger=warn, stdout</font></p><p><font color="#ff0000">log4j.logger.net.sf.hibernate=warn</font></p><p><font color="#ff0000">### log just the SQL<br />#log4j.logger.net.sf.hibernate.SQL=debug</font></p><p><font color="#ff0000">### log JDBC bind parameters ###<br />log4j.logger.net.sf.hibernate.type=info</font></p><p><font color="#ff0000">### log schema export/update ###<br />log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug</font></p><p><font color="#ff0000">### log cache activity ###<br />#log4j.logger.net.sf.hibernate.cache=debug</font></p><p><font color="#ff0000">### enable the following line if you want to track down connection ###<br />### leakages when using DriverManagerConnectionProvider ###<br />#log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trace<br /><br />附3<br /></font></p><pre><font color="#ff0000">log4j.rootLogger=debug, <strong>stdout, R</strong>

log4j.appender.<strong>stdout</strong>=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] <strong>(%F:%L)</strong> - %m%n

log4j.appender.<strong>R</strong>=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=<strong>100KB</strong>
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n<br /><br /><br /><br /><br /><br /></font><font color="#ffa500"> 附4<br /># Log4j由三个重要的组件构成：日志信息的优先级，日志信息的输出目的地，日志信息的输出格式</font></pre><pre><font color="#ffa500"># 1.配置根Logger，其语法为：<br />#　　log4j.rootLogger = [ level ] , appenderName, appenderName, … </font></pre><pre><font color="#ffa500"># 2.配置日志信息输出目的地Appender，其语法为：<br />#　　log4j.appender.appenderName = fully.qualified.name.of.appender.class <br />#　　log4j.appender.appenderName.option1 = value1 <br />#　　… <br />#　　log4j.appender.appenderName.option = valueN <br /># Log4j提供的appender有以下几种： <br /># org.apache.log4j.ConsoleAppender（控制台）， <br /># org.apache.log4j.FileAppender（文件）， <br /># org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br /># org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）， <br /># org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）</font></pre><pre><font color="#ffa500"># 3.配置日志信息的格式（布局），其语法为：<br />#　　log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class <br />#　　log4j.appender.appenderName.layout.option1 = value1 <br />#　　… <br />#　　log4j.appender.appenderName.layout.option = valueN <br /># Log4j提供的layout有以下几种： <br /># org.apache.log4j.HTMLLayout（以HTML表格形式布局）， <br /># org.apache.log4j.PatternLayout（可以灵活地指定布局模式）， <br /># org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串）， <br /># org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）</font></pre><pre><font color="#ffa500"># Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下：<br /># %m  输出代码中指定的消息<br /># %n  输出一个回车换行符，Windows平台为“\r\n”，Unix平台为“\n” <br /># %p  输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL <br /># %r  输出自应用启动到输出该log信息耗费的毫秒数 <br /># %c  输出所属的类目，通常就是所在类的全名 <br /># %t  输出产生该日志事件的线程名<br /># %d  输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，<br />#     比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921 <br /># %l  输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。<br />#     举例：Testlog4.main(TestLog4.java:10)<br /># %F  类目名<br /># %L  代码中的行数</font></pre><pre><font color="#ffa500"># 所有Log信息输出到标准输出(System.out)和在下面指定的一个文件 <br /># 日志信息的优先级从从高到低有ERROR、WARN、INFO、DEBUG<br /># WARN是默认的logging级别<br />log4j.rootCategory = INFO, STDOUT<br />#log4j.rootCategory = INFO, STDOUT, FILE<br />#log4j.rootCategory = INFO, STD<br /> <br /># 配置标准输出Appender<br />log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender<br />log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout<br />#log4j.appender.STDOUT.layout.ConversionPattern = %d{ABSOLUTE} %-5p [%c:%t:%L] %m%n<br />log4j.appender.STDOUT.layout.ConversionPattern = %d{ABSOLUTE} %-5p [ %l ] %m%n</font></pre><pre><font color="#ffa500"># 配置输出文件Appender<br />log4j.appender.FILE = org.apache.log4j.RollingFileAppender<br />log4j.appender.FILE.File = output.log<br />log4j.appender.FILE.MaxFileSize = 2000KB<br />log4j.appender.FILE.MaxBackupIndex = 5<br />log4j.appender.FILE.layout = org.apache.log4j.PatternLayout<br />log4j.appender.FILE.layout.ConversionPattern = %d %-5p [%c:%L] %m%n</font></pre><pre><font color="#ffa500"># 配置默认输出layout<br />log4j.appender.STD = org.apache.log4j.ConsoleAppender<br />log4j.appender.STD.layout = org.apache.log4j.TTCCLayout</font></pre><pre><font color="#ff0000"><font color="#ffa500"># 应用程序的logging级别是DEBUG<br />log4j.logger.com.xzc = DEBUG<br /></font><br /><br /><br /><br /></font></pre><img src ="http://www.blogjava.net/xzclog/aggbug/67481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2006-09-04 00:42 <a href="http://www.blogjava.net/xzclog/archive/2006/09/04/67481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>