﻿<?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-Terry.B.Li           彬-文章分类-Log</title><link>http://www.blogjava.net/libin2722/category/40802.html</link><description>虚其心，可解天下之问；专其心，可治天下之学；静其心，可悟天下之理；恒其心，可成天下之业。</description><language>zh-cn</language><lastBuildDate>Sat, 18 Sep 2010 06:02:02 GMT</lastBuildDate><pubDate>Sat, 18 Sep 2010 06:02:02 GMT</pubDate><ttl>60</ttl><item><title>Tomcat访问日志</title><link>http://www.blogjava.net/libin2722/articles/332297.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Fri, 17 Sep 2010 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/332297.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/332297.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/332297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/332297.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/332297.html</trackback:ping><description><![CDATA[
		<span id="articlecontent" class="wenzhang_con" style="width: 780px;">常使用web服务器的朋友大都了解，一般的web server有两部分日志：<br />
    一是运行中的日志，它主要记录运行的一些信息，尤其是一些异常错误日志信息<br />
    二是访问日志信息，它记录的访问的时间，IP，访问的资料等相关信息。<br />
    <br />
现在我来和大家介绍一下利用tomcat产生的访问日志数据，我们能做哪些有效的分析数据？<br /><br />
首先是配置tomcat访问日志数据，默认情况下访问日志没有打开，配置的方式如下：<br />
    编辑 ${catalina}/conf/server.xml文件.注:${catalina}是tomcat的安装目录<br />
    把以下的注释(&lt;!-- --&gt;)去掉即可。<br />
            &lt;!--<br />
        &lt;Valve className="org.apache.catalina.valves.AccessLogValve"<br />
                 directory="logs"  prefix="localhost_access_log." suffix=".txt"<br />
                 pattern="common" resolveHosts="false"/&gt;<br />
        --&gt;<br />
    其中 directory是产生的目录 tomcat安装${catalina}作为当前目录<br />
    pattern表示日志生产的格式，common是tomcat提供的一个标准设置格式。其具体的表达式为 %h %l %u %t "%r" %s %b<br />
    但本人建议采用以下具体的配置，因为标准配置有一些重要的日志数据无法生。<br />
        %h %l %u %t "%r" %s %b %T  <br />
具体的日志产生样式说明如下(从官方文档中摘录)：<br />
    * %a - Remote IP address<br />
    * %A - Local IP address<br />
    * %b - Bytes sent, excluding HTTP headers, or '-' if zero<br />
    * %B - Bytes sent, excluding HTTP headers<br />
    * %h - Remote host name (or IP address if resolveHosts is false)<br />
    * %H - Request protocol<br />
    * %l - Remote logical username from identd (always returns '-')<br />
    * %m - Request method (GET, POST, etc.)<br />
    * %p - Local port on which this request was received<br />
    * %q - Query string (prepended with a '?' if it exists)<br />
    * %r - First line of the request (method and request URI)<br />
    * %s - HTTP status code of the response<br />
    * %S - User session ID<br />
    * %t - Date and time, in Common Log Format<br />
    * %u - Remote user that was authenticated (if any), else '-'<br />
    * %U - Requested URL path<br />
    * %v - Local server name<br />
    * %D - Time taken to process the request, in millis<br />
    * %T - Time taken to process the request, in seconds<br /><br />
There is also support to write information from the cookie, incoming
header, the Session or something else in the ServletRequest. It is
modeled after the apache syntax:<br /><br />
    * %{xxx}i for incoming headers<br />
    * %{xxx}c for a specific cookie<br />
    * %{xxx}r xxx is an attribute in the ServletRequest<br />
    * %{xxx}s xxx is an attribute in the HttpSession<br /><br /><br />
现在我们回头再来看一下下面这个配置 %h %l %u %t "%r" %s %b %T 生产的访问日志数据，我们可以做哪些事？<br />
先看一下，我们能得到的数据有:<br />
    * %h 访问的用户IP地址<br />
    * %l 访问逻辑用户名，通常返回'-'<br />
    * %u 访问验证用户名，通常返回'-'<br />
    * %t 访问日时<br />
    * %r 访问的方式(post或者是get)，访问的资源和使用的http协议版本<br />
    * %s 访问返回的http状态<br />
    * %b 访问资源返回的流量<br />
    * %T 访问所使用的时间<br />
    <br />
有了这些数据，我们可以根据时间段做以下的分析处理(图片使用jfreechart工具动态生成)：<br />
  * 独立IP数统计<br />
  * 访问请求数统计<br />
  * 访问资料文件数统计<br />
  * 访问流量统计<br />
  * 访问处理响应时间统计<br />
  * 统计所有404错误页面<br />
  * 统计所有500错误的页面<br />
  * 统计访问最频繁页面<br />
  * 统计访问处理时间最久页面<br />
  * 统计并发访问频率最高的页面</span>
<img src ="http://www.blogjava.net/libin2722/aggbug/332297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2010-09-17 14:50 <a href="http://www.blogjava.net/libin2722/articles/332297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j详解</title><link>http://www.blogjava.net/libin2722/articles/287817.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 22 Jul 2009 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/287817.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/287817.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/287817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/287817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/287817.html</trackback:ping><description><![CDATA[1.1. 背景
<br />　　在应用程序中添加日志记录总的来说基于三个目的：监视代码中变量的变化情况，周期性的记录到文件中供其他应用进行统计分析工作；跟踪代码运行时轨迹，作为日后审计的依据；担当集成开发环境中的调试器的作用，向文件或控制台打印代码的调试信息。
<br />　　最普通的做法就是在代码中嵌入许多的打印语句，这些打印语句可以输出到控制台或文件中，比较好的做法就是构造一个日志操作类来封装此类操作，而不是让一系列的打印语句充斥了代码的主体。
<br />1.2. Log4j简介
<br />　　在强调可重用组件开发的今天，除了自己从头到尾开发一个可重用的日志操作类外，Apache为我们提供了一个强有力的日志操作包-Log4j。
<br />　
　Log4j是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务
器、NT的事件记录器、UNIX
Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就
是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。
<br />　　此外，通过Log4j其他语言接口，您可以在C、C+
+、.Net、PL/SQL程序中使用Log4j，其语法和用法与在Java程序中一样，使得多语言分布式系统得到一个统一一致的日志组件模块。而且，通
过使用各种第三方扩展，您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
<br /><strong>Log4j有三个主要的组件：</strong><br />   Loggers(记录器)，Appenders
(输出源)和Layouts(布局)，这里可简单理解为日志类别，日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和
级别，并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明：
<br />1、 Loggers
<br />　
　Loggers组件在此系统中被分为五个级别：DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的，DEBUG
&lt; INFO &lt; WARN &lt; ERROR &lt;
FATAL，分别用来指定这条日志信息的重要程度,明白这一点很重要，这里Log4j有一个规则：假设Loggers级别为P，如果在Loggers中发
生了一个级别Q比P高，则可以启动，否则屏蔽掉。
<br />假设你定义的级别是info，那么error和warn的日志可以显示而比他低的debug信息就不显示了。
<br />Java程序举例来说：
<br />　　 ***建立Logger的一个实例，命名为“com.foo”***
<br />　　　Logger　logger = Logger.getLogger("com.foo"); 
<br />    ***"com.foo"是实例进行命名，也可以任意***
<br />　　 ***设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。***
<br />　　logger.setLevel(Level.INFO);
<br />　　Logger barlogger = Logger.getLogger("com.foo.Bar");
<br />　　***下面这个请求可用，因为WARN &gt;= INFO***
<br />　　logger.warn("Low fuel level.");
<br />　　***下面这个请求不可用，因为DEBUG &lt; INFO***
<br />　　logger.debug("Starting search for nearest gas station.");
<br />　　***命名为“com.foo.bar”的实例barlogger会继承实例“com.foo”的级别。因此，下面这个请求可用，因为INFO &gt;= INFO***
<br />　　barlogger.info("Located nearest gas station.");
<br />　　***下面这个请求不可用，因为DEBUG &lt; INFO***
<br />　　barlogger.debug("Exiting gas station search");
<br />　　这里“是否可用”的意思是能否输出Logger信息。
<br />　　　　在对Logger实例进行命名时，没有限制，可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例，这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息，便于管理。比如：
<br />　　static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());
<br />2、Appenders
<br />　　禁用与使用日志请求只是Log4j其中的一个小小的地方，Log4j日志系统允许把日志输出到不同的地方，如控制台（Console）、文件（Files）、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。
<br />　　
<br />　　其语法表示为：
<br />　　
<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 />　　
<br />　　配置时使用方式为：
<br />　　log4j.appender.appenderName = fully.qualified.name.of.appender.class
<br />　　log4j.appender.appenderName.option1 = value1
<br />　　…
<br />log4j.appender.appenderName.option = valueN
<br />　　这样就为日志的输出提供了相当大的便利。
<br />3、Layouts
<br />　
　有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了
四种日志输出样式，如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。
<br />　　
<br />　　其语法表示为：
<br />　　
<br />　　org.apache.log4j.HTMLLayout（以HTML表格形式布局），
<br />　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式），
<br />　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），
<br />　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）
<br />　　
<br />　　配置时使用方式为：
<br />　　
<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 />4 . Log4j的配置 　
<br />　　以上是从原理方面说明Log4j的使用方法，在具体Java编程使用Log4j可以参照以下示例：
<br />　　1、 建立Logger实例：
<br />　　语法表示：public static Logger getLogger( String name)
<br />　　实际使用：static Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ()) ;
<br />　　2、 读取配置文件：
<br />　　获得了Logger的实例之后，接下来将配置Log4j使用环境：
<br />　　语法表示：
<br />　　BasicConfigurator.configure()：自动快速地使用缺省Log4j环境。
<br />　　PropertyConfigurator.configure(String configFilename)：读取使用Java的特性文件编写的配置文件。
<br />　　DOMConfigurator.configure(String filename)：读取XML形式的配置文件。
<br />　　实际使用：
<br />PropertyConfigurator.configure("ServerWithLog4j.properties");
<br />　　3、 插入日志信息
<br />　　完成了以上连个步骤以后，下面就可以按日志的不同级别插入到你要记录日志的任何地方了。
<br />　　语法表示：
<br />　　Logger.debug(Object message);//调试信息
<br />　　Logger.info(Object message);//一般信息
<br />　　Logger.warn(Object message);//警告信息
<br />　　Logger.error(Object message);//错误信息
<br />　　Logger.fatal(Object message);//致命错误信息
<br />　　实际使用：logger.info("ServerSocket before accept: " + server);
<br /><br />5. 配置过程 
<br /><br />　在实际编程时，要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用。
<br />Log4j支持两种配置文件格式，一种是XML格式的文件，一种是java properties（key=value）【Java特性文件（键=值）】。下面我们介绍使用Java特性文件做为配置文件的方法
<br />具体如下：
<br />　　
<br />　　1、配置根Logger，其语法为：
<br />　　log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
<br />level :
是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优
先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定
义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。
<br />　　 appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
<br />例如：log4j.rootLogger＝info,A1,B2,C3
<br />　　
<br />　　2、配置日志信息输出目的地，其语法为：
<br />　　log4j.appender.appenderName = fully.qualified.name.of.appender.class //
<br />　　 "fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个：
<br />1.org.apache.log4j.ConsoleAppender（控制台）
<br />2.org.apache.log4j.FileAppender（文件）
<br />3.org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）
<br />4.org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）
<br />5.org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）
<br />1.ConsoleAppender选项
<br />Threshold=WARN:指定日志消息的输出最低层次。
<br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
<br />Target=System.err：默认情况下是：System.out,指定输出控制台
<br />2.FileAppender 选项
<br />Threshold=WARN:指定日志消息的输出最低层次。
<br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
<br />File=mylog.txt:指定消息输出到mylog.txt文件。
<br />Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。
<br />3.DailyRollingFileAppender 选项
<br />Threshold=WARN:指定日志消息的输出最低层次。
<br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
<br />File=mylog.txt:指定消息输出到mylog.txt文件。
<br />Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。
<br />DatePattern='.'yyyy-ww:每周滚动一次文件，即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下：
<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 />4.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. 在日志文件到达该大小时，将会自动滚动，即将原来的内容移到mylog.log.1文件。
<br />MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
<br />实际应用：
<br />　　log4j.appender.A1=org.apache.log4j.ConsoleAppender //这里指定了日志输出的第一个位置A1是控制台ConsoleAppender
<br />　　
<br />　　3、配置日志信息的格式，其语法为：
<br />　　A. log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
<br />"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个：
<br />1.org.apache.log4j.HTMLLayout（以HTML表格形式布局），
<br />　　 2.org.apache.log4j.PatternLayout（可以灵活地指定布局模式），
<br />　　 3.org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），
<br />　　 4.org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）
<br />1.HTMLLayout 选项
<br />LocationInfo=true:默认值是false,输出java文件名称和行号
<br />Title=my app file: 默认值是 Log4J Log Messages.
<br />2.PatternLayout 选项
<br />ConversionPattern=%m%n :指定怎样格式化指定的消息。
<br />3.XMLLayout 选项
<br />LocationInfo=true:默认值是false,输出java文件和行号
<br />实际应用：
<br />　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout
<br />B. log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
<br />这里需要说明的就是日志信息格式中几个符号所代表的含义：
<br />　　 －X号: 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 />可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如：
<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 />　　这里上面三个步骤是对前面Log4j组件说明的一个简化；下面给出一个具体配置例子，在程序中可以参照执行：
<br />　　log4j.rootLogger=INFO,A1，B2
<br />　　log4j.appender.A1=org.apache.log4j.ConsoleAppender
<br />　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout
<br />　　log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
<br />　　根据上面的日志格式，某一个程序的输出结果如下：
<br />　　0　　INFO　2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]
<br />16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'
<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD
<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'
<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP
<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'
<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT
<br /><br />4. # 当输出信息于回滚文件时
<br />log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender //指定以文件的方式输出日志
<br />log4j.appender.ROLLING_FILE.Threshold=ERROR 
<br />log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、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 />6. Log4j比较全面的配置
<br />  LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了， 
<br />log4j.rootLogger=DEBUG,CONSOLE,A1,im 
<br />log4j.addivity.org.apache=true 
<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 />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 />log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender 
<br />log4j.appender.ROLLING_FILE.Threshold=ERROR 
<br />log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、rolling.log
<br />log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆盖
<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 />#应用于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 /># Log Factor 5 Appender 
<br />log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender 
<br />log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 
<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 />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 />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 />#自定义Appender 
<br />log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender 
<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 />log4j.appender.im.layout=org.apache.log4j.PatternLayout 
<br />log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
<img src ="http://www.blogjava.net/libin2722/aggbug/287817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-07-22 11:13 <a href="http://www.blogjava.net/libin2722/articles/287817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用log4j的邮件功能</title><link>http://www.blogjava.net/libin2722/articles/287816.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 22 Jul 2009 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/287816.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/287816.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/287816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/287816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/287816.html</trackback:ping><description><![CDATA[Log4j的邮件功能能够为我们做这样的事情----当程序运行完的时候，或者正在运行也是可以的，它将程序的日志通过邮件的方式发到你的邮箱上。
<p>    这样，对于程序运行的控制就不用每次都跑到机器上去看日志文件这么麻烦了，我们需要的只是，开开Foxmail，用用鼠标，就可以知道，程序到底运行的怎么样了。</p><p>    </p><ul><li><h3>    使用log4j-1.2.15</h3></li></ul><p>               之前用的是 log4j-1.2.8 ，照理说，它们之间的版本号的区别够小，应该没有什么区别，但是事实却让我丈二摸不着头脑。</p><p>             发送邮件的一个重要的类是SMTPAppender。</p><p>             在1.2.8的版本中，SMTPAppender没有smtpPassword 和smtpUsername
属性。这两个属性分别是登录smtp服务器用的用户名和密码。笔者到现在也没有想明白，在通常的情况下怎样才可以不登录smtp服务器就可以发送邮件了。
有知道的朋友，就留个言吧，先谢过啦。</p><p>              由于不能解决上面的那个问题，我就只好使用1.2.15这个版本啦。</p><ul><li>   log4j.properties文件</li></ul><p>            </p><div class="dp-highlighter"><div class="bar"><div class="tools">Java代码 <embed lk_media="yes" lk_mediaid="lk_juiceapp_mediaPopup_1248229109797" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=log4j.appender.MAIL%3Dorg.apache.log4j.net.SMTPAppender%0A%0Alog4j.appender.MAIL.BufferSize%3D10%0A%0Alog4j.appender.MAIL.From%3Dyourname%40%20domain.com%0A%0Alog4j.appender.MAIL.SMTPHost%3Dmail.domain.com%0A%0Alog4j.appender.MAIL.Subject%3DLog4J%20Message%0A%0Alog4j.appender.MAIL.To%3Dtarget%40domain.com%0A%0Alog4j.appender.MAIL.SMTPUsername%3Dusername%0A%0Alog4j.appender.MAIL.SMTPPassword%3Dpassword%0A%0Alog4j.appender.MAIL.layout%3Dorg.apache.log4j.PatternLayout%0A%0Alog4j.appender.MAIL.layout%3Dorg.apache.log4j.PatternLayout%0A%0Alog4j.appender.MAIL.layout.ConversionPattern%3D%5Bframework%5D%20%25d%20-%20%25c%20-%25-4r%20%5B%25t%5D%20%25-5p%20%25c%20%25x%20-%20%25m%25n%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></embed></div></div><ol class="dp-j" start="1"><li><span><span>log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender  </span></span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.BufferSize=<span class="number">10</span><span>  </span></span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.From=yourname@ domain.com  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.SMTPHost=mail.domain.com  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.Subject=Log4J Message  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.To=target<span class="annotation">@domain</span><span>.com  </span></span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.SMTPUsername=username  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.SMTPPassword=password  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n  </span></li></ol></div><pre style="display: none;" name="code" class="java">log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender

log4j.appender.MAIL.BufferSize=10

log4j.appender.MAIL.From=yourname@ domain.com

log4j.appender.MAIL.SMTPHost=mail.domain.com

log4j.appender.MAIL.Subject=Log4J Message

log4j.appender.MAIL.To=target@domain.com

log4j.appender.MAIL.SMTPUsername=username

log4j.appender.MAIL.SMTPPassword=password

log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout

log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout

log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
</pre><p>           这个文件配好以后，恭喜你，现在log4j的邮件功能，你就可以体会了。</p><ul><li>  SMTP的级别默认是ERROR级别的，怎么办</li></ul><p>             默认的级别是ERROR级别的，那就是说，只有程序出错了，你才可以收到邮件，很显然，这还不能满足我们日常管理的要求。我们需要自定义的级别。</p><p>            为此，笔者继承了TriggeringEventEvaluator类，覆盖里面的一个方面，如下所示</p><div class="dp-highlighter"><div class="bar"><div class="tools">Java代码 <embed lk_media="yes" lk_mediaid="lk_juiceapp_mediaPopup_1248229109808" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%40Override%0A%09public%20boolean%20isTriggeringEvent(LoggingEvent%20arg0)%20%7B%0A%09%09return%20arg0.getLevel().isGreaterOrEqual(Level.INFO)%3B%0A%09%7D" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></embed></div></div><ol class="dp-j" start="1"><li><span><span class="annotation">@Override</span><span>  </span></span></li><li><span>    <span class="keyword">public</span><span> </span><span class="keyword">boolean</span><span> isTriggeringEvent(LoggingEvent arg0) {  </span></span></li><li><span>        <span class="keyword">return</span><span> arg0.getLevel().isGreaterOrEqual(Level.INFO);  </span></span></li><li><span>    }  </span></li></ol></div><pre style="display: none;" name="code" class="java">@Override
	public boolean isTriggeringEvent(LoggingEvent arg0) {
		return arg0.getLevel().isGreaterOrEqual(Level.INFO);
	}</pre><p>  </p><ul><li>   每遇到一个触发事件就发一封邮件！</li></ul><p>            SMTPAppender 实现是，每当isTriggeringEvent（）这个方法返回true的时候，它都会发送邮件。这样的话，一个程序执行下来，每个有能力触发的事件都会形成一封邮件。这显然不是我们希望看到的场面。</p><p>            笔者继承了SMTPAppender类，重装了append方法。           </p><div class="dp-highlighter"><div class="bar"><div class="tools">Java代码 <embed lk_media="yes" lk_mediaid="lk_juiceapp_mediaPopup_1248229109816" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%40Override%0A%09public%20void%20append(LoggingEvent%20event)%20%7B%0A%0A%09%09if%20(!checkEntryConditions())%20%7B%0A%09%09%09return%3B%0A%09%09%7D%0A%0A%09%09event.getThreadName()%3B%0A%09%09event.getNDC()%3B%0A%09%09event.getMDCCopy()%3B%0A%09%09if%20(this.getLocationInfo())%20%7B%0A%09%09%09event.getLocationInformation()%3B%0A%09%09%7D%0A%09%09cb.add(event)%3B%0A%09%09if%20(evaluator.isTriggeringEvent(event))%20%7B%0A%09%09%09if%20(cb.length()%20%3E%20this.getBufferSize()%20%2F%202)%20%7B%0A%09%09%09%09sendBuffer()%3B%0A%09%09%09%7D%0A%0A%09%09%7D%0A%09%7D" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></embed></div></div><ol class="dp-j" start="1"><li><span><span class="annotation">@Override</span><span>  </span></span></li><li><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> append(LoggingEvent event) {  </span></span></li><li><span>  </span></li><li><span>        <span class="keyword">if</span><span> (!checkEntryConditions()) {  </span></span></li><li><span>            <span class="keyword">return</span><span>;  </span></span></li><li><span>        }  </span></li><li><span>  </span></li><li><span>        event.getThreadName();  </span></li><li><span>        event.getNDC();  </span></li><li><span>        event.getMDCCopy();  </span></li><li><span>        <span class="keyword">if</span><span> (</span><span class="keyword">this</span><span>.getLocationInfo()) {  </span></span></li><li><span>            event.getLocationInformation();  </span></li><li><span>        }  </span></li><li><span>        cb.add(event);  </span></li><li><span>        <span class="keyword">if</span><span> (evaluator.isTriggeringEvent(event)) {  </span></span></li><li><span>            <span class="keyword">if</span><span> (cb.length() &gt; </span><span class="keyword">this</span><span>.getBufferSize() / </span><span class="number">2</span><span>) {  </span></span></li><li><span>                sendBuffer();  </span></li><li><span>            }  </span></li><li><span>  </span></li><li><span>        }  </span></li><li><span>    }  </span></li></ol></div><pre style="display: none;" name="code" class="java">@Override
	public void append(LoggingEvent event) {

		if (!checkEntryConditions()) {
			return;
		}

		event.getThreadName();
		event.getNDC();
		event.getMDCCopy();
		if (this.getLocationInfo()) {
			event.getLocationInformation();
		}
		cb.add(event);
		if (evaluator.isTriggeringEvent(event)) {
			if (cb.length() &gt; this.getBufferSize() / 2) {
				sendBuffer();
			}

		}
	}</pre><p>          这样的话，当事件的个数达到bufferSize的一半的时候就会发一封邮件了。</p><p>          但是另外一个问题也随之产生了，当程序结束时，还在缓冲里面的事件是不会被发送出来的。因为事件数往往没有bufferSize的一半。</p><p>          </p><div class="dp-highlighter"><div class="bar"><div class="tools">Java代码 <embed lk_media="yes" lk_mediaid="lk_juiceapp_mediaPopup_1248229109825" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=public%20%20%20*****SMTPAppender()%20%7B%0A%09%09Runtime.getRuntime().addShutdownHook(new%20Thread()%20%7B%0A%0A%09%09%09%40Override%0A%09%09%09public%20void%20run()%20%7B%0A%09%09%09%09if%20(cb.length()%20%3E%200)%20%7B%0A%09%09%09%09%09sendBuffer()%3B%0A%09%09%09%09%7D%0A%0A%09%09%09%7D%0A%0A%09%09%7D)%3B%0A%09%7D" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></embed></div></div><ol class="dp-j" start="1"><li><span><span class="keyword">public</span><span>   *****SMTPAppender() {  </span></span></li><li><span>        Runtime.getRuntime().addShutdownHook(<span class="keyword">new</span><span> Thread() {  </span></span></li><li><span>  </span></li><li><span>            <span class="annotation">@Override</span><span>  </span></span></li><li><span>            <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> run() {  </span></span></li><li><span>                <span class="keyword">if</span><span> (cb.length() &gt; </span><span class="number">0</span><span>) {  </span></span></li><li><span>                    sendBuffer();  </span></li><li><span>                }  </span></li><li><span>  </span></li><li><span>            }  </span></li><li><span>  </span></li><li><span>        });  </span></li><li><span>    }  </span></li></ol></div><pre style="display: none;" name="code" class="java">public   *****SMTPAppender() {
		Runtime.getRuntime().addShutdownHook(new Thread() {

			@Override
			public void run() {
				if (cb.length() &gt; 0) {
					sendBuffer();
				}

			}

		});
	}</pre><p> </p><p>         笔者在构造函数中，添加了一个程序结束时运行的线程，来处理这个问题。</p><ul><li>  设置Html格式的输出</li></ul><p>            按照刚刚笔者给出的配置文件，所产生的邮件的格式是纯文本的。其实log4j有网页格式的输出的。</p><p>            </p><div class="dp-highlighter"><div class="bar"><div class="tools">Property文件代码 <embed lk_media="yes" lk_mediaid="lk_juiceapp_mediaPopup_1248229109833" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=log4j.appender.MAIL.layout%3Dorg.apache.log4j.HTMLLayout" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></embed></div></div><ol class="dp-default" start="1"><li><span><span>log4j.appender.MAIL.layout=org.apache.log4j.HTMLLayout  </span></span></li></ol></div><pre style="display: none;" name="code" class="property文件">log4j.appender.MAIL.layout=org.apache.log4j.HTMLLayout</pre><p> </p><p>          这样的话，邮件就好看很多啦。</p><ul><li>  解决邮件中的中文乱码问题</li></ul><p>            最后，你会发现中文是乱码的，而且HTMLLayout没有提供编码方式的属性设置，哎，又是一阵无语中。</p><p>           得，笔者也就只好再写一个类，继承HTMLLayout,覆盖getContentType方法</p><p>           </p><div class="dp-highlighter"><div class="bar"><div class="tools">Java代码 <embed lk_media="yes" lk_mediaid="lk_juiceapp_mediaPopup_1248229109841" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%40Override%0A%09public%20String%20getContentType()%20%7B%0A%09%09return%20%22text%2Fhtml%3Bcharset%3DGBK%22%3B%0A%0A%09%7D" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></embed></div></div><ol class="dp-j" start="1"><li><span><span class="annotation">@Override</span><span>  </span></span></li><li><span>    <span class="keyword">public</span><span> String getContentType() {  </span></span></li><li><span>        <span class="keyword">return</span><span> </span><span class="string">"text/html;charset=GBK"</span><span>;  </span></span></li><li><span>  </span></li><li><span>    }  </span></li></ol></div><pre style="display: none;" name="code" class="java">@Override
	public String getContentType() {
		return "text/html;charset=GBK";

	}</pre><p>           添加上述功能之后的配置文件如下所示：</p><div class="dp-highlighter"><div class="bar"><div class="tools">Java代码 <embed lk_media="yes" lk_mediaid="lk_juiceapp_mediaPopup_1248229109850" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=log4j.appender.MAIL.To%3Dtarget%40domain.com%0A%0Alog4j.appender.MAIL.From%3Dyourname%40domain.com%0A%0Alog4j.appender.MAIL.SMTPHost%3Dsmtp.domain.com%0A%0Alog4j.appender.MAIL.Subject%3D%20Information%0A%0Alog4j.appender.MAIL.SMTPUsername%3Dusername%0A%0Alog4j.appender.MAIL.SMTPPassword%3Dpassword%0A%0Alog4j.appender.MAIL.EvaluatorClass%3Dcom.wole.***.MailEvaluator%0A%0Alog4j.appender.MAIL.layout%3Dcom.wole.log4j.net.DefaultLayOut" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></embed></div></div><ol class="dp-j" start="1"><li><span><span>log4j.appender.MAIL.To=target</span><span class="annotation">@domain</span><span>.com  </span></span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.From=yourname<span class="annotation">@domain</span><span>.com  </span></span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.SMTPHost=smtp.domain.com  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.Subject= Information  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.SMTPUsername=username  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.SMTPPassword=password  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.EvaluatorClass=com.wole.***.MailEvaluator  </span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.layout=com.wole.log4j.net.DefaultLayOut  <br /></span></li></ol></div><img src ="http://www.blogjava.net/libin2722/aggbug/287816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-07-22 11:12 <a href="http://www.blogjava.net/libin2722/articles/287816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>比较有用的log4j.properties</title><link>http://www.blogjava.net/libin2722/articles/287815.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 22 Jul 2009 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/287815.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/287815.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/287815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/287815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/287815.html</trackback:ping><description><![CDATA[
		<p>log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE<br />log4j.addivity.org.apache=true</p>
		<p># 应用于控制台<br />log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender<br />log4j.appender.CONSOLE.Threshold=INFO<br />log4j.appender.CONSOLE.Target=System.out<br />log4j.appender.CONSOLE.Encoding=GBK<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</p>
		<p># 用于数据库<br />#log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender<br />#log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/ww<br />#log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver<br />#log4j.appender.DATABASE.user=root <br />#log4j.appender.DATABASE.password=123<br />#log4j.appender.CONSOLE.Threshold=WARN<br />#log4j.appender.DATABASE.sql=INSERT
INTO LOG4J(stamp,thread, infolevel,class,messages) VALUES
('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')<br /># INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')<br /># 写入数据库中的表LOG4J的Message字段中，内容％d（日期）%c: 日志信息所在地（类名）%p: 日志信息级别%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</p>
		<p># 每天新建日志<br />log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.A1.File=C:/log4j/log<br />log4j.appender.A1.Encoding=GBK<br />log4j.appender.A1.Threshold=DEBUG<br />log4j.appender.A1.DatePattern='.'yyyy-MM-dd<br />log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n</p>
		<p>#应用于文件<br />log4j.appender.FILE=org.apache.log4j.FileAppender<br />log4j.appender.FILE.File=C:/log4j/file.log<br />log4j.appender.FILE.Append=false<br />log4j.appender.FILE.Encoding=GBK<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</p>
		<p># 应用于文件回滚<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.CONSOLE_FILE.Encoding=GBK<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</p>
		<p>#自定义Appender<br />log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender<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 = <a href="mailto:corlin@cybercorlin.net">corlin@cybercorlin.net</a><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</p>
		<p>#应用于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 /># Log Factor 5 Appender<br />log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender<br />log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000</p>
		<p># 发送日志给邮件<br />log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender<br />log4j.appender.MAIL.Threshold=FATAL<br />log4j.appender.MAIL.BufferSize=10<br /><a href="mailto:log4j.appender.MAIL.From=web@www.wuset.com">log4j.appender.MAIL.From=web@www.wuset.com</a><br />log4j.appender.MAIL.SMTPHost=www.wusetu.com<br />log4j.appender.MAIL.Subject=Log4J Message<br /><a href="mailto:log4j.appender.MAIL.To=web@www.wusetu.com">log4j.appender.MAIL.To=web@www.wusetu.com</a><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</p>
<img src ="http://www.blogjava.net/libin2722/aggbug/287815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-07-22 11:10 <a href="http://www.blogjava.net/libin2722/articles/287815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用相对路径加载Log4j配置文件</title><link>http://www.blogjava.net/libin2722/articles/287813.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 22 Jul 2009 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/287813.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/287813.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/287813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/287813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/287813.html</trackback:ping><description><![CDATA[
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: rgb(0, 0, 0);">
						<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="color: rgb(0, 0, 0);">URL url </span>
								<span style="color: rgb(0, 0, 0);">=</span>
								<span style="color: rgb(0, 0, 0);"> UserServiceImpl.</span>
								<span style="color: rgb(0, 0, 255);">class</span>
								<span style="color: rgb(0, 0, 0);">.getResource(</span>
								<span style="color: rgb(0, 0, 0);">"</span>
								<span style="color: rgb(0, 0, 0);">/config/log4j.properties</span>
								<span style="color: rgb(0, 0, 0);">"</span>
								<span style="color: rgb(0, 0, 0);">);<br />Properties properties </span>
								<span style="color: rgb(0, 0, 0);">=</span>
								<span style="color: rgb(0, 0, 0);"> </span>
								<span style="color: rgb(0, 0, 255);">new</span>
								<span style="color: rgb(0, 0, 0);"> Properties();<br /></span>
								<span style="color: rgb(0, 0, 255);">try</span>
								<span style="color: rgb(0, 0, 0);"> {<br />     properties.load(</span>
								<span style="color: rgb(0, 0, 255);">new</span>
								<span style="color: rgb(0, 0, 0);"> InputStreamReader(url.openStream()));<br />    } </span>
								<span style="color: rgb(0, 0, 255);">catch</span>
								<span style="color: rgb(0, 0, 0);"> (IOException e) {<br />        e.printStackTrace();<br />    }<br />PropertyConfigurator.configure(properties);</span>
						</div>
				</span>
				<span style="color: rgb(0, 0, 0);">
						<span style="color: rgb(0, 0, 0);">
								<br />/config/log4j.properties 可以放在对应的jar文件中</span>
				</span>
				<span style="color: rgb(0, 0, 0);">
				</span>
		</div>
<img src ="http://www.blogjava.net/libin2722/aggbug/287813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-07-22 10:59 <a href="http://www.blogjava.net/libin2722/articles/287813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Web Service Appender for Log4j 管理日志纪录</title><link>http://www.blogjava.net/libin2722/articles/286831.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 15 Jul 2009 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/286831.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/286831.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/286831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/286831.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/286831.html</trackback:ping><description><![CDATA[
		<blockquote>使用定制的 Web Service Appender for Log4j 将日志信息发送到某一集中位置。Log4j Appender 使您可以在面向服务架构 (SOA) 解决方案中调试和跟踪任意问题。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N1005E">
						<span class="atitle">引言</span>
				</a>
		</p>
		<p>你
可以使用 Web Service Appender 将日志集中到某一位置，同时，Web Service Appender
允许管理者监控、开发者调试面向服务架构(SOA)环境里可能存在的任何问题。Web Service Appender 是一种扩展 JAVA
类，它由 Log4j 的 Appender 类扩展而来。</p>
		<p>
从定义上看，SOA
是一种彼此可以互相通信的服务集合，但这些服务的内容是各自独立的，每一类服务均不受其它服务内容或服务状态的影响，并且这些服务都工作在分布式的系统架
构里。在 SOA 中，Web 服务通常被用来在给定事务中处理请求，这些请求可以是遗留代码、企业级 Java Beans(EJBs)
的封装，也可以是 Java
类的封装，使用一种可以将日志信息聚集在中心位置里的日志纪录方法，能帮助您隔离缺陷和问题，并能让你更好的理解逻辑流的处理。 </p>
		<p>
将特定模块或服务的日志消息纪录到一个中心位置的机制，可以把可能潜在的问题和缺陷降低到最小。</p>
		<p>本文对 Log4j 的功能进行了大体的概述，并介绍了如何编写自定义的 Log4j Appender，这类特殊的 Appender 将日志消息编到一种特定的 Web 服务。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10071">
						<span class="atitle">Log4j 快速入门</span>
				</a>
		</p>
		<p>Log4j
是一种开放源代码的日志库，它已被发展为 Apache Software Foundation 日志服务项目的子项目。该库是以 IBM 在 90
年代末开发的日志库为基础的，第一版发布于 1999 年。现在它在开放源代码团体得到了广泛使用，它的体系是围绕以下三个主要概念构建起来的：</p>
		<ul>
				<li>Logger</li>
				<li>Appender</li>
				<li>Layout</li>
		</ul>
		<p>这些概念可以让您根据消息类型、消息优先级来纪录消息，您可以控制消息在何处结束及消息如何格式化。
Logger 是应用程序首先调用以初始化消息纪录的对象。当把某一消息传递给日志时，logger 会生成 <code>LoggingEvent</code>，对消息进行封装。之后，Logger 对象将 <code>LoggingEvent</code> 传递给与之关联的 Appender。</p>
		<p>Appender 将 <code>LoggingEvent</code> 所包含的消息发送给指定的目标输出文件。所谓指定的文件，大多数情况下，是 Log4 属性文件。一些 Appender 存在于 Log4j 中。您也可以扩展 Appender，使之支持其它的目标文件，比如 XML 文件、控制台等等。</p>
		<p>在 Log4j 里， <code>LoggingEvent</code> 被赋予某一级别，以表明它们的优先级。缺省的级别包括如下几种：
			</p>
		<ul>
				<li>OFF：可能是最高的级别，它是用来关闭日志纪录的</li>
				<li>FATAL：指出现了非常严重的错误事件，这些错误可能会导致应用程序异常中止</li>
				<li>ERROR：指虽有错误，但仍允许应用程序继续运行</li>
				<li>WARN：指运行环境潜藏着危害</li>
				<li>INFO：指报告信息，这些信息在粗粒度级别上突出显示应用程序的进程</li>
				<li>DEBUG：指细粒度信息事件，细粒度信息事件对于应用程序的调试是最有用的</li>
				<li>ALL：可能是最低的级别，其目的是打开所有日志记录</li>
		</ul>Logger 和 Appender 也被赋予上述的某一级别，并且仅执行等于或高于它们自身的级别的日志请求。比如，如果一个 Appender 属于 INFO 级别，而日志请求属于 DEBUG，那么 Appender 将不会为给定的日志事件写消息。
			
			<br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N100B7"><span class="atitle">客户端组件</span></a></p><p><a name="N100BD"><span class="smalltitle">客户端 log4j.properties 文件</span></a></p><p> 客户端 log4j.properties 文件是一种标准文件，它包含服务或模块使用的所有 Appender。Web Service Appender 要求有一个<i>端点（endpoint）</i> 属性以指定所使用的日志服务。</p><p><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing1">清单 1</a> 描述了使用 <code>WebServiceAppender</code> 所必需的 Web 服务客户端 Log4j 属性。 黑体显示的文本指明了将访问 <code>WebServiceAppender</code> 服务器端的 Appender。属性文件是使用 Log4j 的基本需求，它可以让您配置应用程序以使用多个 Appender 以及 logging severity。一旦应用程序进入运行状态或潜在的问题得到解决，您就可以轻松地修改属性文件。</p><br /><a name="listing1"><b>清单 1：客户端 Log4j 的属性文件</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />#set the level of the root logger <br />log4j.rootLogger = INFO, CONSOLE<br />#set own logger<br />log4j.logger.com.carmelouria.logging.test=CONSOLE<br />log4j.appender.CONSOLE=com.carmelouria.logging.WebServiceAppender<br /><span class="boldcode">log4j.appender.CONSOLE.endpoint=<br />         http://localhost:9080/log4j/services/LogAppenderService</span><br />log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.CONSOLE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n<br /></pre></td></tr></tbody></table><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N100E6"><span class="atitle">服务器的 Log4j.properties 文件</span></a></p><p>服
务器 Log4j.properties 文件被用来关联客户端 Log4j 属性文件，它指定了日志的级别及服务器将如何输出消息。对于支持
Log4j 的应用程序，您可以定义多个 appender。当然，这些 appender 既可以用于客户端服务，也可以用于服务模块。</p><p><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing2">清单 2</a> 描述了一份典型的 Log4j 属性文件，服务器端的 <code>WebServiceAppender</code> 使用缺省的 Log4j Appenders。服务器端的 Appender 可以潜在的调用另一个 <code>WebServiceAppender</code>，并将日志信息<i>链接</i>起来：</p><br /><a name="listing2"><b>清单 2：服务器端的 Log4j 属性文件</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />#set the level of the root logger <br />log4j.rootLogger = INFO, FILE<br />#set own logger<br />log4j.appender.FILE=org.apache.log4j.RollingFileAppender<br />log4j.appender.FILE.file=c:/temp/log4j/server/server.log<br />log4j.appender.FILE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.FILE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n<br /></pre></td></tr></tbody></table><br /><p><a name="N1010C"><span class="smalltitle">客户端程序测试示例：</span></a></p><p>这个客户端程序示例是无格式普通 Java 对象(POJO)，它记录了一条消息，并被配置为使用 Web Service Appender 来处理消息。<a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing3">清单 3</a> 显示了这个示例：</p><br /><a name="listing3"><b>清单 3：客户端应用程序使用 WebServiceAppender 的示例</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />package com.carmelouria.logging.test;<br />import org.apache.log4j.Level;<br />import org.apache.log4j.Logger;<br />import org.apache.log4j.PropertyConfigurator;<br />/**<br /> * @author Carmelo Uria<br /> *<br />*/<br />public class LoggingSample<br />{<br />    private static Logger logger = Logger.getLogger(LoggingSample.class.getName());<br />    /**<br />     * <br />     */<br />    public LoggingSample()<br />    {<br />        super();<br />        PropertyConfigurator.configure("c:/temp/log4j.properties");<br />        logger.log(Level.INFO, "LoggingSample instantiation...");<br />        System.out.println("finished...");<br />    }<br />    public static void main(String[] args)<br />    {<br />        LoggingSample sample = new LoggingSample();<br />    }<br />}<br /></pre></td></tr></tbody></table><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N10124"><span class="atitle">WebServiceAppender</span></a></p><p><code>WebServiceAppender</code> 是必需的，它可以将消息发送到指定的 Web 服务。<code>WebServiceAppender</code> 继承了 org.log4j.Appender，它允许使用 log4.properties，并成为有效的 Log4j Appender。</p><p>WebServiceAppender
使用基于 XML 的远程过程调用 (JAX-RPC) 的 Java API，来将消息发送到服务器。JAX-RPC 是一种规范，它描述使用
RPC 和 XML 构建 Web 服务和 Web 服务客户端的应用编程接口 (API) 和约定。JAX-RPC 又被称为 JSR 101。</p><p><code>LoggingEvent</code> 通过 <code>SOAPElement</code> 被分割并表示为 XML。javax.xml.soap.SOAPElement 接口意味着服务端点接口将包含一个参数，或返回 javax.xml.soap.SOAPElement 类型的值，以对应于 schema 中每个使用<code>&lt;xsd:any/&gt;</code>的地方。从本质上看，它是 XML 参数的封装，且没有相应的序列化/反序列化 JAVA 类。例如，一旦客户请求记录一个消息，就会创建一个 <code>LoggEvent</code> 对象，然后传送给 Appender。在这种情况下，Appender 就是 <code>WebServiceAppender</code>。Appender 检索事件，并在解析事件中的信息。一些额外的信息会被加入，如主机名称，这样您就知道这些消息来自哪个系统。同时，append 方法也将消息转换为 <code>SOAPElement</code>，这样就可以通过 <code>executeWebService</code> 方法将消息传递给 Web 服务。使用 <code>SOAPElement</code> 充分考虑了 <code>WebServiceAppender</code> 未来版本的可扩展性问题。</p><br /><a name="listing4"><b>清单4：执行 WebServiceAppender 服务的 Append 方法</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />    protected void append(LoggingEvent event)<br />    {<br />        // create Web Service client using endpoint<br />        if (endpoint == null)<br />        {<br />            System.out.println("no endpoint set.  Check configuration file");<br />            System.out.println("[" + hostname + "] " + this.layout.format(event));<br />            return;<br />        }<br />        executeWebService(event);<br />    }<br />    private void executeWebService(LoggingEvent event)<br />    {<br />        SoapClient client = new SoapClient();<br />        URL endPoint = null;<br />        try<br />        {<br />            endPoint = new URL(getendpoint());<br />        }<br />        catch (MalformedURLException e1)<br />        {<br />            e1.printStackTrace();<br />        }<br />        String nameSpace = "http://ejb.logging.carmelouria.com";<br />        QName serviceName = new QName(nameSpace, "LogAppenderServiceService");<br />        QName operation = new QName(nameSpace, "log");<br />        QName port = new QName(nameSpace, "LogAppenderService");<br />        Parameter message = <br />        new Parameter("log", Constants.XSD_ANY, SOAPElement.class, ParameterMode.IN);<br />        try<br />        {<br />            /**<br />             *create SOAPElement from LoggingEvent need hostname<br />             */<br />            Level level = event.getLevel();<br />            String sysLog = "&lt;syslog&gt;" + new Integer(level.getSyslogEquivalent()).toString()<br /><!-- code sample is too wide -->                                      + "&lt;/syslog&gt;";<br />            String startTime = new Long(LoggingEvent.getStartTime()).toString();<br />            String timeTag = "&lt;start_time&gt;" + startTime + "&lt;/start_time&gt;";<br />            String hostName = "&lt;hostname&gt;" + InetAddress.getLocalHost() +<br />                                           "&lt;/hostname&gt;";<br />            String threadName = "&lt;thread_name&gt;" + event.getThreadName()<br />                                            +"&lt;/thread_name&gt;";<br />            String logger = "&lt;logger&gt;" + event.getLoggerName() + "&lt;/logger&gt;";<br />            String eventMessage = "&lt;message&gt;" + event.getRenderedMessage() +<br />                                                  "&lt;/message&gt;";<br />            String log = hostName + threadName + logger + timeTag + sysLog +<br />                                eventMessage;<br />            String throwableInformation[] = event.getThrowableStrRep();<br />            if (throwableInformation != null)<br />            {<br />                for (int i = 0; i &lt; throwableInformation.length; i++)<br />                {<br />                    String throwable = "&lt;throwable_information&gt;" + throwableInformation[i] +<br /><!-- code sample is too wide -->                                                   "&lt;/throwable_information&gt;";<br />                    log += throwable;<br />                }<br />            }<br />            String ndcString = event.getNDC();<br />            if (throwableInformation != null)<br />            {<br />                String throwable = &lt;ndc&gt;" + ndcString + &lt;/ndc&gt;";<br />                log += throwable;<br />            }<br />            message.setValue(SOAPElementFactory.create(&lt;log&gt;" + log + &lt;/log&gt;"));<br />        }<br />        catch (UnknownHostException unknownHostException)<br />        {<br />            unknownHostException.printStackTrace();<br />        }<br />        catch (SOAPException e2)<br />        {<br />            e2.printStackTrace();<br />        }<br />        Parameter resultType = newParameter("logResponse",<br />                                        Constants.WEBSERVICES_VOID,<br />                                        Object.class,<br />                                         ParameterMode.OUT);<br />        Parameter[] parameters = { message };<br />        try<br />        {<br />            // execute client<br />            Object result = <br />            client.execute(endPoint, serviceName, operation, "wrapped", null,<br />                                                            port, resultType, parameters);<br />            if ((result != null) &amp;&amp; (result instanceof String))<br />                System.out.println((String) result);<br />        }<br />        catch (ClientException e)<br />        {<br />            e.printStackTrace();<br />        }<br />    }<br /></pre></td></tr></tbody></table><br /><p><a name="N1016A"><span class="smalltitle">Hostname</span></a></p><p>不幸的是，Log4j 的 <code>LoggingEvent</code> 没有包含 Hostname，而 Hostname 是 Web Service Appender 众多需求之一。在创建 <code>SOAPElement</code> 以前，您可以用下面的语句将 Hostname 添加到 XML 文件里：</p><p><code>String hostName = "&lt;hostname&gt;" + InetAddress.getLocalHost() + "&lt;/hostname&gt;";</code></p><p><a name="N10182"><span class="smalltitle">SoapElementFactory</span></a></p><p><code>SoapElementFactory</code> 是主要用于创建 <code>SOAPElement</code> 的类。它同时支持创建 IBM 和 Java 的 <code>SOAPElement</code> 实现，如<a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing5">清单 5</a> 所示：</p><br /><a name="listing5"><b>清单 5：使用 SoapElementFactory 类的创建方法</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />    public static javax.xml.soap.SOAPElement create(String xml) throws SOAPException<br />    {<br />        com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory factory =<br />        (com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory) <br />        com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory<br />                .newInstance();<br />        SOAPElement element =<br />                  (javax.xml.soap.SOAPElement)factory.createElementFromXMLString(xml);<br />        return(element);<br />    }<br />    public static SOAPElement create(String arg0, String arg1, String arg2, <br />                                                            boolean ibmSoapElement) throws <br /><!-- code sample is too wide -->                                                            SOAPException<br />    {<br />        if (ibmSoapElement)<br />        {<br />            SOAPFactory soapFactory =<br />              (com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory)<br />              com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory.newInstance();<br />            return (soapFactory.createSOAPElement(arg0, arg1));<br />        }<br />        javax.xml.soap.SOAPFactory soapFactory =<br />                        javax.xml.soap.SOAPFactory.newInstance();<br />        return (soapFactory.createElement(arg0, arg1, arg2));<br />    }<br /></pre></td></tr></tbody></table><br /><p><a name="N101A5"><span class="smalltitle">SoapClient</span></a></p><p><code>SoapClient</code> 类封装了 <code>Call</code> 接口的 JAX-RPC 实现，javax.xml.rpc.Call 接口提供了对服务端点动态调用的支持。javax.xml.rpc.Service 接口就好象是创建 <code>Call</code> 实例的工厂。</p><p><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing6">清单 6</a> 说明了客户端如何动态调用服务。这允许对服务进行变更，而无需生成客户端代理来访问远程服务。</p><br /><a name="listing6"><b>清单 6：使用 SoapClient 类的调用方法</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />    private Object call(SoapService service, QName operation, QName portType, <br />    String operationStyleProperty,<br />            String encodingURIProperty, Parameter returnType, <br />            Parameter[] parameters) throws ClientException<br />    {<br />        QName portName;<br />        String response = null;<br />        Object results = null;<br />        Call call = null;<br />        try<br />        {<br />            // check to see if Service object exists<br />            if (service == null)<br />                throw new ClientException("Invalid Service object.  It maybe null.");<br />            // retrieve call from Service object<br />            call = service.createCall();<br />            call.setOperationName(operation);<br />            call.setPortTypeName(portType);<br />            // check call object<br />            if (call == null)<br />                throw new ClientException("invalid operation.  Call object is null.");<br />            // set default values<br />            if (operationStyleProperty == null)<br />                call.setProperty(Call.OPERATION_STYLE_PROPERTY,<br />                                          OPERATION_STYLE_DOCUMENT_TYPE);<br />            else<br />                call.setProperty(Call.OPERATION_STYLE_PROPERTY,<br />                                          operationStyleProperty);<br />            if (encodingURIProperty == null)<br />                call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY,<br />                                          ENCODING_LITERAL);<br />            else<br />                call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY,<br />                                           encodingURIProperty);<br />            call.setTargetEndpointAddress(service.getServiceEndPoint());<br />            //create Parameter class for SoapClient<br />            for (int i = 0; i &lt; parameters.length; i++)<br />            {<br />                Class classObject = parameters[i].getClassObject();<br />                if (classObject != null)<br />                    call.addParameter(parameters[i].getName(), parameters[i].getXmlType(),<br />                            parameters[i].getClassObject(), parameters[i].getMode());<br />                else<br />                    call.addParameter(parameters[i].getName(), parameters[i].getXmlType(),<br />                             parameters[i].getMode());<br />            }<br />            // pass parameter as ReturnType<br />            if (returnType != null)<br />            {<br />                if (returnType.getClassObject() != null)<br />                 call.setReturnType(returnType.getXmlType(), returnType.getClassObject());<br />                else<br />                 call.setReturnType(returnType.getXmlType());<br />            }<br />            Object[] request = new Object[parameters.length];<br />            // add parameter values<br />            for (int i = 0; i &lt; request.length; i++)<br />            {<br />                request[i] = parameters[i].getValue();<br />            }<br />            results = call.invoke(request);<br />        }<br />        catch (SOAPFaultException e)<br />        {<br />            System.out.println(e.getFaultString());<br />            e.getStackTrace();<br />            throw new ClientException(e.getLocalizedMessage(), e);<br />        }<br />        catch (ServiceException serviceException)<br />        {<br />            serviceException.getStackTrace();<br />            throw new ClientException(serviceException.getLocalizedMessage(),<br />                                                         serviceException);<br />        }<br />        catch (RemoteException exception)<br />        {<br />            exception.printStackTrace();<br />            throw new ClientException(exception.getLocalizedMessage(), exception);<br />        }<br />        return (results); }<br /></pre></td></tr></tbody></table><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N101CB"><span class="atitle">服务组件</span></a></p><p><a name="N101D1"><span class="smalltitle">Log4j.server.properties</span></a></p><p>Log4j.server.properties 文件包含了一个基本的 Log4j 配置文件，该文件可以让您指定把哪些日志发送给 Web 服务系统。</p><br /><a name="listing7"><b>清单 7：Log4j.server.properties 文件</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />#set the level of the root logger <br />log4j.rootLogger = INFO, FILE<br />#set own logger<br />log4j.appender.FILE=org.apache.log4j.RollingFileAppender<br />log4j.appender.FILE.file=c:/temp/log4j/server/server.log<br />log4j.appender.FILE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.FILE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n<br /></pre></td></tr></tbody></table><br /><p><a name="N101E4"><span class="smalltitle">LogAppenderBean.java</span></a></p><p>LogAppenderBean.java 是 Web Service Appender 服务所要使用的 EJB。该服务启动 <code>LogAppenderBean</code> 以处理来自每个 Web Service Appender 客户端的每一个请求。</p><p><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing8">清单 8</a> 显示了来自 <code>WebServiceAppender</code> EJB 的 <i>log</i> 方法，该方法解析来自客户端的消息，并将客户端信息纪录到服务的服务器端。</p><br /><a name="listing8"><b>清单 8：LogAppenderBean 的 log 方法</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />    public void log(SOAPElement message)<br />    {              <br />        try<br />        {<br />            InputSource source = ((IBMSOAPElement)<br />                                    message).toInputSource(false);<br />            Document document = Parser.parse(source);<br />            String log = null;<br />            String hostname =<br />                 document.selectSingleNode("//hostname").getText();<br />            String threadName =<br />                 document.selectSingleNode("//thread_name").getText();<br />            String syslog =<br />                 document.selectSingleNode("//syslog").getText();<br />            String startTime = new Long(<br />                             document.selectSingleNode("//start_time").<br />                             getText()).toString();<br />            log = '[' + startTime + ':' + hostname + ':' + threadName +<br />                  "] " + document.selectSingleNode(<br />                         "//message").getText();<br />            // retrieve any throwable messages<br />            List throwableList = document.selectNodes(<br />                                 "//throwable_information");<br />            if(throwableList != null)<br />            {<br />                Iterator throwables = throwableList.iterator();<br />                while(throwables.hasNext())<br />                {<br />                    log += '\n' + ((Node)throwables.next()).getText();<br />                }<br /><br />                log += '\n';<br />            }<br /><br />            logger.log(Level.toLevel(new Integer(syslog).intValue()),<br />                       log);<br />            logger.log(Level.INFO,log);<br />         }<br />        catch(ParserException parseException)<br />        {<br />            parseException.printStackTrace();<br />        }<br />        catch (SAXException e)<br />        {<br />            e.printStackTrace();<br />        }<br />    }<br /></pre></td></tr></tbody></table><br /><p>通过 IBM <code>SOAPElement</code> 的 InputSource，每一个 <code>SOAPElement</code> 的内容都会被检索。目前，只有 IBM WebSphere® Application Server (Application Server) 支持这些代码（请参阅<a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#resources">参考资料</a>）。 然而，如果您移除 IBM <code>SOAPElement</code>，那么您就可以在任何应用服务器上使用这些代码。IBM
<code>SOAPElement</code> 内置的性能优化也适用于 Application Server。</p><p>每一个 <code>SOAPElement</code>
都使用 Dom4j 来读取、解析和转换。Dom4j 是一种在内存中表示 XML 树的对象模型。Dom4j 提供了一组易于使用的
API，从而为我们提供了一整套强大的功能来处理、操作或定位 XML，使用 XPath 和 XSLT 进行工作，以及与 SAX、
JAXP、DOM 集成。</p><p>除了可以使用任意的 XML 解析器外，DOM4J 还允许使用任意的 SAX 解析器，为实现更好的性能，还允许使用所有标准的 XSLT 转换器。
转换被用来析取发送给 Web Service Appender 的客户端 <code>LoggingEvent</code> 的元素。</p><p>如果您允许使用 <code>SOAPElement</code>，那么就需要在代码中维持最大限度的灵活性。Web Service Appender 服务可以被修改，以支持所有发送给服务的 XML。
</p><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N10235"><span class="atitle">输出</span></a></p><p>下面的示例展示了 Web Service Appender 的可能的输出：</p><p><code>INFO [WebContainer : 0] ejb.LogAppenderBean (log:?) :: [1111513482641:OO7-64BIT/9.48.114.183:main]LoggingSample instantiation...</code></p><p><b>OO7-64BIT/9.48.114.183</b> 是机器名和 IP 地址，而 <b>main</b> 是日志所在处的方法名。</p><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N1024E"><span class="atitle">结束语</span></a></p><p>Web
Service Appender 是将日志集中到某一位置的基本工具。由于 Web Service Appender 是 Log4j 的
Appender 类的子集，因而配置和使用 Appender 都非常简单易懂。您可以修改 Log4j 的属性文件，这样，使用 Log4j
的现有应用程序和服务就可以马上使用 Web Service Appender。</p><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><span class="atitle"><a name="download">下载</a></span></p><table class="data-table-1" border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><th scope="col">描述</th><th scope="col">名字</th><th scope="col">大小</th><th scope="col">下载方法</th></tr><tr><th class="tb-row" scope="row">Foundation Class Library</th><td nowrap="nowrap">foundation.zip</td><td nowrap="nowrap">47 KB</td><td nowrap="nowrap"><a class="fbox" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/library/ws-log4jcode/foundation.zip"><b>HTTP</b></a></td></tr><tr><th class="tb-row" scope="row">Logging Web Service J2EE Application</th><td nowrap="nowrap">LoggingWebService.ear</td><td nowrap="nowrap">1976 KB</td><td nowrap="nowrap"><a class="fbox" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/library/ws-log4jcode/LoggingWebService.ear"><b>HTTP</b></a></td></tr><tr><th class="tb-row" scope="row">Unit Test Sample Code</th><td nowrap="nowrap">SoapClientTest.java</td><td nowrap="nowrap">5 KB</td><td nowrap="nowrap"><a class="fbox" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/library/ws-log4jcode/SoapClientTest.java"><b>HTTP</b></a></td></tr></tbody></table><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="12" height="12" /><img src ="http://www.blogjava.net/libin2722/aggbug/286831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-07-15 11:49 <a href="http://www.blogjava.net/libin2722/articles/286831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>