ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人在线视频,大香伊人久久,久久国产夜色精品鲁鲁99http://www.aygfsteel.com/libin2722/category/40802.html虚其心,可解天下之问åQ›ä¸“其心åQŒå¯æ²Õd¤©ä¸‹ä¹‹å­¦ï¼›é™å…¶å¿ƒï¼Œå¯æ‚Ÿå¤©ä¸‹ä¹‹ç†åQ›æ’其心åQŒå¯æˆå¤©ä¸‹ä¹‹ä¸šã€?/description>zh-cnSat, 18 Sep 2010 06:02:02 GMTSat, 18 Sep 2010 06:02:02 GMT60Tomcat讉K—®æ—¥å¿—http://www.aygfsteel.com/libin2722/articles/332297.html½C¼ç‰©½C¼ç‰©Fri, 17 Sep 2010 06:50:00 GMThttp://www.aygfsteel.com/libin2722/articles/332297.htmlhttp://www.aygfsteel.com/libin2722/comments/332297.htmlhttp://www.aygfsteel.com/libin2722/articles/332297.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/332297.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/332297.html叿€‹É用web服务器的朋友大都了解åQŒä¸€èˆ¬çš„web server有两部分日志åQ?br />     一是运行中的日志,它主要记录运行的一些信息,ž®¤å…¶æ˜¯ä¸€äº›å¼‚帔R”™è¯¯æ—¥å¿—ä¿¡æ?br />     二是讉K—®æ—¥å¿—信息åQŒå®ƒè®°å½•的访问的旉™—´åQŒIPåQŒè®¿é—®çš„资料½{‰ç›¸å…³ä¿¡æ¯ã€?br />    
现在我来和大家介¾lä¸€ä¸‹åˆ©ç”¨tomcat产生的访问日志数据,我们能做哪些有效的分析数据?

首先是配¾|®tomcat讉K—®æ—¥å¿—数据åQŒé»˜è®¤æƒ…况下讉K—®æ—¥å¿—没有打开åQŒé…¾|®çš„æ–¹å¼å¦‚下åQ?br />     ¾~–辑 ${catalina}/conf/server.xmlæ–‡äšg.æ³?${catalina}是tomcat的安装目å½?br />     把以下的注释(<!-- -->)åŽÀLŽ‰å›_¯ã€?br />             <!--
        <Valve className="org.apache.catalina.valves.AccessLogValve"
                 directory="logs"  prefix="localhost_access_log." suffix=".txt"
                 pattern="common" resolveHosts="false"/>
        -->
    其中 directory是äñ”生的目录 tomcat安装${catalina}ä½œäØ“å½“å‰ç›®å½•
    pattern表示日志生äñ”的格式,common是tomcat提供的一个标准设¾|®æ ¼å¼ã€‚其具体的表辑ּä¸?%h %l %u %t "%r" %s %b
    但本人徏议采用以下具体的配置åQŒå› ä¸ºæ ‡å‡†é…¾|®æœ‰ä¸€äº›é‡è¦çš„æ—¥å¿—数据无法生ã€?br />         %h %l %u %t "%r" %s %b %T 
具体的日志äñ”生样式说明如ä¸?从官æ–ÒŽ–‡æ¡£ä¸­æ‘˜å½•)åQ?br />     * %a - Remote IP address
    * %A - Local IP address
    * %b - Bytes sent, excluding HTTP headers, or '-' if zero
    * %B - Bytes sent, excluding HTTP headers
    * %h - Remote host name (or IP address if resolveHosts is false)
    * %H - Request protocol
    * %l - Remote logical username from identd (always returns '-')
    * %m - Request method (GET, POST, etc.)
    * %p - Local port on which this request was received
    * %q - Query string (prepended with a '?' if it exists)
    * %r - First line of the request (method and request URI)
    * %s - HTTP status code of the response
    * %S - User session ID
    * %t - Date and time, in Common Log Format
    * %u - Remote user that was authenticated (if any), else '-'
    * %U - Requested URL path
    * %v - Local server name
    * %D - Time taken to process the request, in millis
    * %T - Time taken to process the request, in seconds

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:

    * %{xxx}i for incoming headers
    * %{xxx}c for a specific cookie
    * %{xxx}r xxx is an attribute in the ServletRequest
    * %{xxx}s xxx is an attribute in the HttpSession


现在我们回头再来看一下下面这个配¾|?%h %l %u %t "%r" %s %b %T 生äñ”的访问日志数据,我们可以做哪些事åQ?br /> 先看一下,我们能得到的数据æœ?
    * %h 讉K—®çš„用户IP地址
    * %l 讉K—®é€»è¾‘用户名,通常˜q”回'-'
    * %u 讉K—®éªŒè¯ç”¨æˆ·åï¼Œé€šå¸¸˜q”回'-'
    * %t 讉K—®æ—¥æ—¶
    * %r 讉K—®çš„æ–¹å¼?post或者是get)åQŒè®¿é—®çš„资源和ä‹É用的http协议版本
    * %s 讉K—®˜q”回的http状æ€?br />     * %b 讉K—®èµ„源˜q”回的流é‡?br />     * %T 讉K—®æ‰€ä½¿ç”¨çš„æ—¶é—?br />    
有了˜q™äº›æ•°æ®åQŒæˆ‘们可以根据时间段做以下的分析处理(囄¡‰‡ä½¿ç”¨jfreechart工具动态生æˆ?åQ?br />   * 独立IP数统è®?br />   * 讉K—®è¯äh±‚数统è®?br />   * 讉K—®èµ„料文äšg数统è®?br />   * 讉K—®‹¹é‡¾lŸè®¡
  * 讉K—®å¤„理响应旉™—´¾lŸè®¡
  * ¾lŸè®¡æ‰€æœ?04错误™åµé¢
  * ¾lŸè®¡æ‰€æœ?00错误的页é?br />   * ¾lŸè®¡è®‰K—®æœ€é¢‘繁™åµé¢
  * ¾lŸè®¡è®‰K—®å¤„理旉™—´æœ€ä¹…页é?br />   * ¾lŸè®¡òq¶å‘讉K—®é¢‘率最高的™åµé¢

]]>
log4j详解http://www.aygfsteel.com/libin2722/articles/287817.html½C¼ç‰©½C¼ç‰©Wed, 22 Jul 2009 03:13:00 GMThttp://www.aygfsteel.com/libin2722/articles/287817.htmlhttp://www.aygfsteel.com/libin2722/comments/287817.htmlhttp://www.aygfsteel.com/libin2722/articles/287817.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/287817.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/287817.html  在应用程序中æ·ÕdŠ æ—¥å¿—è®°å½•æ€Èš„来说åŸÞZºŽä¸‰ä¸ªç›®çš„åQšç›‘视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码˜qè¡Œæ—¶è½¨˜q¹ï¼Œä½œäؓ日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打åîC»£ç çš„调试信息ã€?
  最普通的做法ž®±æ˜¯åœ¨ä»£ç ä¸­åµŒå…¥è®¸å¤šçš„æ‰“印语句,˜q™äº›æ‰“印语句可以输出到控制台或文件中åQŒæ¯”较好的做法就是构造一个日志操作类来封装此¾cÀL“ä½œï¼Œè€Œä¸æ˜¯è®©ä¸€¾pÕdˆ—的打印语句充斥了代码的主体ã€?
1.2. Log4j½Ž€ä»?
  在强调可重用¾l„äšg开发的今天åQŒé™¤äº†è‡ªå·×ƒ»Žå¤´åˆ°ž®‘Ö¼€å‘一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4jã€?
   Log4j是Apache的一个开放源代码™å¹ç›®åQŒé€šè¿‡ä½¿ç”¨Log4jåQŒæˆ‘们可以控制日志信息输送的目的地是控制台、文件、GUI¾l„äšg、甚è‡Ïx˜¯å¥—接口服åŠ? 器、NT的事件记录器、UNIX Syslog守护˜q›ç¨‹½{‰ï¼›æˆ‘们也可以控制每一条日志的输出格式åQ›é€šè¿‡å®šä¹‰æ¯ä¸€æ¡æ—¥å¿—信息的¾U§åˆ«åQŒæˆ‘们能够更加细致地控制日志的生成过½E‹ã€‚最令äh感兴­‘£çš„ž®? 是,˜q™äº›å¯ä»¥é€šè¿‡ä¸€ä¸ªé…¾|®æ–‡ä»¶æ¥ç‰|´»åœ°è¿›è¡Œé…¾|®ï¼Œè€Œä¸éœ€è¦ä¿®æ”¹åº”用的代码ã€?
  此外åQŒé€šè¿‡Log4j其他语言接口åQŒæ‚¨å¯ä»¥åœ¨C、C+ +ã€?Net、PL/SQL½E‹åºä¸­ä‹É用Log4jåQŒå…¶è¯­æ³•和用法与在Java½E‹åºä¸­ä¸€æ øP¼Œä½¿å¾—多语­a€åˆ†å¸ƒå¼ç³»¾lŸå¾—åˆîC¸€ä¸ªç»Ÿä¸€ä¸€è‡´çš„æ—¥å¿—¾l„äšg模块。而且åQŒé€? ˜q‡ä‹É用各¿Uç¬¬ä¸‰æ–¹æ‰©å±•åQŒæ‚¨å¯ä»¥å¾ˆæ–¹ä¾¿åœ°ž®†Log4j集成到J2EE、JINI甚至是SNMP应用中ã€?
Log4j有三个主要的¾l„äšgåQ?/strong>
   Loggers(记录å™?åQŒAppenders (输出æº?å’ŒLayouts(布局)åQŒè¿™é‡Œå¯½Ž€å•ç†è§£äØ“æ—¥å¿—¾cÕdˆ«åQŒæ—¥å¿—要输出的地方和日志以何¿UåŞ式输出。综合ä‹É用这三个¾l„äšg可以è½ÀL¾çš„记录信息的¾cÕdž‹å’? ¾U§åˆ«åQŒåƈ可以在运行时控制日志输出的样式和位置。下面对三个¾l„äšg分别˜q›è¡Œè¯´æ˜ŽåQ?
1�Loggers
   Loggers¾l„äšg在此¾pȝ»Ÿä¸­è¢«åˆ†äؓ五个¾U§åˆ«åQšDEBUG、INFO、WARN、ERRORå’ŒFATAL。这五个¾U§åˆ«æ˜¯æœ‰™åºåºçš„,DEBUG < INFO < WARN < ERROR < FATALåQŒåˆ†åˆ«ç”¨æ¥æŒ‡å®šè¿™æ¡æ—¥å¿—信息的重要½E‹åº¦,明白˜q™ä¸€ç‚¹å¾ˆé‡è¦åQŒè¿™é‡ŒLog4j有一个规则:假设Loggers¾U§åˆ«ä¸ºPåQŒå¦‚果在Loggers中发 生了一个çñ”别Q比P高,则可以启动,否则屏蔽掉ã€?
假设你定义的¾U§åˆ«æ˜¯infoåQŒé‚£ä¹ˆerrorå’Œwarn的日志可以显½Cø™€Œæ¯”他低的debug信息ž®×ƒ¸æ˜„¡¤ºäº†ã€?
Java½E‹åºä¸¾ä¾‹æ¥è¯´åQ?
   ***建立Logger的一个实例,命名为“com.foo�**
   Logger logger = Logger.getLogger("com.foo");
    ***"com.foo"是实例进行命名,也可以ä“Qæ„?**
   ***讄¡½®loggerçš„çñ”别。通常不在½E‹åºä¸­è®¾¾|®loggerçš„çñ”别。一般在配置文äšg中设¾|®ã€?**
  logger.setLevel(Level.INFO);
  Logger barlogger = Logger.getLogger("com.foo.Bar");
  ***下面˜q™ä¸ªè¯äh±‚可用åQŒå› ä¸ºWARN >= INFO***
  logger.warn("Low fuel level.");
  ***下面˜q™ä¸ªè¯äh±‚ä¸å¯ç”¨ï¼Œå› äØ“DEBUG < INFO***
  logger.debug("Starting search for nearest gas station.");
  ***命名为“com.foo.bar”的实例barlogger会ç‘ô承实例“com.foo”的¾U§åˆ«ã€‚因此,下面˜q™ä¸ªè¯äh±‚可用åQŒå› ä¸ºINFO >= INFO***
  barlogger.info("Located nearest gas station.");
  ***下面˜q™ä¸ªè¯äh±‚ä¸å¯ç”¨ï¼Œå› äØ“DEBUG < INFO***
  barlogger.debug("Exiting gas station search");
  ˜q™é‡Œâ€œæ˜¯å¦å¯ç”¨â€çš„æ„æ€æ˜¯èƒ½å¦è¾“出Logger信息ã€?
    在对Logger实例˜q›è¡Œå‘½åæ—Óž¼Œæ²¡æœ‰é™åˆ¶åQŒå¯ä»¥å–ä»ÀL„è‡ªå·±æ„Ÿå…´­‘£çš„åå­—ã€‚ä¸€èˆ¬æƒ…å†µä¸‹å»ø™®®ä»¥ç±»çš„æ‰€åœ¨ä½¾|®æ¥å‘½åLogger实例åQŒè¿™æ˜¯ç›®å‰æ¥è®²æ¯”较有效的Logger命名方式。这样可以ä‹É得每个类建立自己的日志信息,便于½Ž¡ç†ã€‚比如:
  static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());
2、Appenders
  ¼›ç”¨ä¸Žä‹É用日志请求只是Log4j其中的一个小ž®çš„地方åQŒLog4j日志¾pȝ»Ÿå…è®¸æŠŠæ—¥å¿—输出到不同的地方,如控制台åQˆConsoleåQ‰ã€æ–‡ä»Óž¼ˆFilesåQ‰ã€æ ¹æ®å¤©æ•°æˆ–者文件大ž®äñ”生新的文件、以‹¹çš„形式发送到其它地方½{‰ç­‰ã€?
  
  其语法表½CÞZØ“åQ?
  
  org.apache.log4j.ConsoleAppenderåQˆæŽ§åˆ¶å°åQ?
  org.apache.log4j.FileAppenderåQˆæ–‡ä»Óž¼‰
  org.apache.log4j.DailyRollingFileAppenderåQˆæ¯å¤©äñ”生一个日志文ä»Óž¼‰
org.apache.log4j.RollingFileAppenderåQˆæ–‡ä»¶å¤§ž®åˆ°è¾¾æŒ‡å®šå°ºå¯¸çš„æ—¶å€™äñ”生一个新的文ä»Óž¼‰
  org.apache.log4j.WriterAppenderåQˆå°†æ—¥å¿—信息以流格式发送到ä»ÀL„æŒ‡å®šçš„地方)
  
  配置时ä‹Éç”¨æ–¹å¼äØ“åQ?
  log4j.appender.appenderName = fully.qualified.name.of.appender.class
  log4j.appender.appenderName.option1 = value1
  �
log4j.appender.appenderName.option = valueN
  ˜q™æ ·ž®×ƒØ“日志的输出提供了相当大的便利ã€?
3、Layouts
   有时用户希望æ ÒŽ®è‡ªå·±çš„喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供äº? 四种日志输出样式åQŒå¦‚æ ÒŽ®HTML样式、自由指定样式、包含日志çñ”别与信息的样式和包含日志旉™—´ã€çº¿½E‹ã€ç±»åˆ«ç­‰ä¿¡æ¯çš„æ ·å¼ç­‰½{‰ã€?
  
  其语法表½CÞZØ“åQ?
  
  org.apache.log4j.HTMLLayoutåQˆä»¥HTML表格形式布局åQ‰ï¼Œ
  org.apache.log4j.PatternLayoutåQˆå¯ä»¥çµ‹zÕdœ°æŒ‡å®šå¸ƒå±€æ¨¡å¼åQ‰ï¼Œ
  org.apache.log4j.SimpleLayoutåQˆåŒ…含日志信息的¾U§åˆ«å’Œä¿¡æ¯å­—½W¦ä¸²åQ‰ï¼Œ
  org.apache.log4j.TTCCLayoutåQˆåŒ…含日志äñ”生的旉™—´ã€çº¿½E‹ã€ç±»åˆ«ç­‰½{‰ä¿¡æ¯ï¼‰
  
  配置时ä‹Éç”¨æ–¹å¼äØ“åQ?
  
  log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class
  log4j.appender.appenderName.layout.option1 = value1
  �
  log4j.appender.appenderName.layout.option = valueN
4 . Log4j的配¾|? 
  以上是从原理斚w¢è¯´æ˜ŽLog4jçš„ä‹É用方法,在具体Java¾~–程使用Log4j可以参照以下½CÞZ¾‹åQ?
  1ã€?建立Logger实例åQ?
  语法表示åQšpublic static Logger getLogger( String name)
  实际使用åQšstatic Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ()) ;
  2ã€?è¯Õd–配置文äšgåQ?
  获得了Logger的实例之后,接下来将配置Log4j使用环境åQ?
  语法表示åQ?
  BasicConfigurator.configure()åQšè‡ªåŠ¨å¿«é€Ÿåœ°ä½¿ç”¨¾~ºçœLog4j环境ã€?
  PropertyConfigurator.configure(String configFilename)åQšè¯»å–ä‹É用Java的特性文件编写的配置文äšgã€?
  DOMConfigurator.configure(String filename)åQšè¯»å–XML形式的配¾|®æ–‡ä»¶ã€?
  实际使用åQ?
PropertyConfigurator.configure("ServerWithLog4j.properties");
  3�插入日志信息
  完成了以上连个步骤以后,下面ž®±å¯ä»¥æŒ‰æ—¥å¿—的不同çñ”别插入到你要记录日志的ä“Q何地方了ã€?
  语法表示åQ?
  Logger.debug(Object message);//调试信息
  Logger.info(Object message);//一般信�
  Logger.warn(Object message);//警告信息
  Logger.error(Object message);//错误信息
  Logger.fatal(Object message);//致命错误信息
  实际使用åQšlogger.info("ServerSocket before accept: " + server);

5. 配置˜q‡ç¨‹

 在实际编½E‹æ—¶åQŒè¦ä½¿Log4j真正在系¾lŸä¸­˜qè¡Œäº‹å…ˆ˜q˜è¦å¯šw…¾|®æ–‡ä»¶è¿›è¡Œå®šä¹‰ã€‚定义步骤就是对Logger、Appender及Layout的分别ä‹É用ã€?
Log4j支持两种配置文äšg格式åQŒä¸€¿Uæ˜¯XML格式的文ä»Óž¼Œä¸€¿Uæ˜¯java propertiesåQˆkey=valueåQ‰ã€Javaç‰ÒŽ€§æ–‡ä»Óž¼ˆé”?å€û|¼‰ã€‘。下面我们介¾lä‹É用Javaç‰ÒŽ€§æ–‡ä»¶åšä¸ºé…¾|®æ–‡ä»¶çš„æ–ÒŽ³•
具体如下åQ?
  
  1、配¾|®æ ¹LoggeråQŒå…¶è¯­æ³•为:
  log4j.rootLogger = [ level ] , appenderName1, appenderName2, �
level : 是日志记录的优先¾U§ï¼Œåˆ†äØ“OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的çñ”别。Log4j廸™®®åªä‹É用四个çñ”别,ä¼? å…ˆçñ”从高åˆîC½Žåˆ†åˆ«æ˜¯ERROR、WARN、INFO、DEBUG。通过在这里定义的¾U§åˆ«åQŒæ‚¨å¯ä»¥æŽ§åˆ¶åˆ°åº”用程序中相应¾U§åˆ«çš„æ—¥å¿—信息的开兟뀂比如在˜q™é‡Œå®? 义了INFO¾U§åˆ«åQŒåˆ™åº”用½E‹åºä¸­æ‰€æœ‰DEBUG¾U§åˆ«çš„æ—¥å¿—信息将不被打印出来ã€?
   appenderName:ž®±æ˜¯æŒ‡å®šæ—¥å¿—信息输出到哪个地斏V€‚您可以同时指定多个输出目的地ã€?
例如åQšlog4j.rootLoggeråQinfo,A1,B2,C3
  
  2、配¾|®æ—¥å¿—信息输出目的地åQŒå…¶è¯­æ³•为:
  log4j.appender.appenderName = fully.qualified.name.of.appender.class //
   "fully.qualified.name.of.appender.class" 可以指定下面五个目的åœîC¸­çš„一个:
1.org.apache.log4j.ConsoleAppenderåQˆæŽ§åˆ¶å°åQ?
2.org.apache.log4j.FileAppenderåQˆæ–‡ä»Óž¼‰
3.org.apache.log4j.DailyRollingFileAppenderåQˆæ¯å¤©äñ”生一个日志文ä»Óž¼‰
4.org.apache.log4j.RollingFileAppenderåQˆæ–‡ä»¶å¤§ž®åˆ°è¾¾æŒ‡å®šå°ºå¯¸çš„æ—¶å€™äñ”生一个新的文ä»Óž¼‰
5.org.apache.log4j.WriterAppenderåQˆå°†æ—¥å¿—信息以流格式发送到ä»ÀL„æŒ‡å®šçš„地方)
1.ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层‹Æ¡ã€?
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌™¾“出ã€?
Target=System.erråQšé»˜è®¤æƒ…况下是:System.out,指定输出控制å?
2.FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层‹Æ¡ã€?
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌™¾“出ã€?
File=mylog.txt:指定消息输出到mylog.txtæ–‡äšgã€?
Append=false:默认值是true,卛_°†æ¶ˆæ¯å¢žåŠ åˆ°æŒ‡å®šæ–‡ä»¶ä¸­åQŒfalse指将消息覆盖指定的文件内宏V€?
3.DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层‹Æ¡ã€?
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌™¾“出ã€?
File=mylog.txt:指定消息输出到mylog.txtæ–‡äšgã€?
Append=false:默认值是true,卛_°†æ¶ˆæ¯å¢žåŠ åˆ°æŒ‡å®šæ–‡ä»¶ä¸­åQŒfalse指将消息覆盖指定的文件内宏V€?
DatePattern='.'yyyy-ww:每周滚动一‹Æ¡æ–‡ä»Óž¼ŒåÏx¯å‘¨äñ”生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小�
6)'.'yyyy-MM-dd-HH-mm: 每分�
4.RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层‹Æ¡ã€?
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌™¾“出ã€?
File=mylog.txt:指定消息输出到mylog.txtæ–‡äšgã€?
Append=false:默认值是true,卛_°†æ¶ˆæ¯å¢žåŠ åˆ°æŒ‡å®šæ–‡ä»¶ä¸­åQŒfalse指将消息覆盖指定的文件内宏V€?
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小æ—Óž¼Œž®†ä¼šè‡ªåŠ¨æ»šåŠ¨åQŒå³ž®†åŽŸæ¥çš„å†…å®¹¿UÕdˆ°mylog.log.1æ–‡äšgã€?
MaxBackupIndex=2:指定可以产生的滚动文件的最大数�
实际应用åQ?
  log4j.appender.A1=org.apache.log4j.ConsoleAppender //˜q™é‡ŒæŒ‡å®šäº†æ—¥å¿—输出的½W¬ä¸€ä¸ªä½¾|®A1是控制台ConsoleAppender
  
  3、配¾|®æ—¥å¿—信息的格式åQŒå…¶è¯­æ³•为:
  A. log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个:
1.org.apache.log4j.HTMLLayoutåQˆä»¥HTML表格形式布局åQ‰ï¼Œ
   2.org.apache.log4j.PatternLayoutåQˆå¯ä»¥çµ‹zÕdœ°æŒ‡å®šå¸ƒå±€æ¨¡å¼åQ‰ï¼Œ
   3.org.apache.log4j.SimpleLayoutåQˆåŒ…含日志信息的¾U§åˆ«å’Œä¿¡æ¯å­—½W¦ä¸²åQ‰ï¼Œ
   4.org.apache.log4j.TTCCLayoutåQˆåŒ…含日志äñ”生的旉™—´ã€çº¿½E‹ã€ç±»åˆ«ç­‰½{‰ä¿¡æ¯ï¼‰
1.HTMLLayout 选项
LocationInfo=true:默认值是false,输出javaæ–‡äšg名称和行å?
Title=my app file: 默认值是 Log4J Log Messages.
2.PatternLayout 选项
ConversionPattern=%m%n :指定怎样格式化指定的消息�
3.XMLLayout 选项
LocationInfo=true:默认值是false,输出javaæ–‡äšg和行å?
实际应用åQ?
  log4j.appender.A1.layout=org.apache.log4j.PatternLayout
B. log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
˜q™é‡Œéœ€è¦è¯´æ˜Žçš„ž®±æ˜¯æ—¥å¿—信息格式中几个符åäh‰€ä»£è¡¨çš„含义:
   åQXå? X信息输出时左寚w½åQ?
%p: 输出日志信息优先¾U§ï¼Œå³DEBUGåQŒINFOåQŒWARNåQŒERRORåQŒFATAL,
%d: 输出日志旉™—´ç‚¹çš„æ—¥æœŸæˆ–æ—¶é—ß_¼Œé»˜è®¤æ ¼å¼ä¸ºISO8601åQŒä¹Ÿå¯ä»¥åœ¨å…¶åŽæŒ‡å®šæ ¼å¼ï¼Œæ¯”如åQ?d{yyy MMM dd HH:mm:ss,SSS}åQŒè¾“出类ä¼û|¼š2002òq?0æœ?8æ—?22åQ?0åQ?8åQ?21
%r: 输出自应用启动到输出该log信息耗费的毫¿U’æ•°
%c: 输出日志信息所属的¾cȝ›®åQŒé€šå¸¸ž®±æ˜¯æ‰€åœ¨ç±»çš„å…¨å?
%t: 输出产生该日志事件的¾U¿ç¨‹å?
%l: 输出日志事äšg的发生位¾|®ï¼Œç›¸å½“äº?C.%M(%F:%L)的组å?包括¾cȝ›®åã€å‘生的¾U¿ç¨‹åQŒä»¥åŠåœ¨ä»£ç ä¸­çš„行数。ä‹D例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线½E‹ç›¸å…Œ™”çš„NDC(嵌套诊断环境),ž®¤å…¶ç”¨åˆ°åƒjava servlets˜q™æ ·çš„多客户多线½E‹çš„应用中ã€?
%%: 输出一�%"字符
%F: 输出日志消息产生时所在的文äšg名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信�
%n: 输出一个回车换行符åQŒWindowsòq›_°ä¸?\r\n"åQŒUnixòq›_°ä¸?\n"输出日志信息换行
可以åœ?与模式字½W¦ä¹‹é—´åŠ ä¸Šä¿®é¥°ç¬¦æ¥æŽ§åˆ¶å…¶æœ€ž®å®½åº¦ã€æœ€å¤§å®½åº¦ã€å’Œæ–‡æœ¬çš„对齐方式。如åQ?
1)%20cåQšæŒ‡å®šè¾“å‡ºcategory的名¿UŽÍ¼Œæœ€ž®çš„宽度æ˜?0åQŒå¦‚æžœcategory的名¿U°å°äº?0的话åQŒé»˜è®¤çš„æƒ…况下右寚w½ã€?
2)%-20c:指定输出category的名¿UŽÍ¼Œæœ€ž®çš„宽度æ˜?0åQŒå¦‚æžœcategory的名¿U°å°äº?0的话åQ?-"åähŒ‡å®šå·¦å¯šw½ã€?
3)%.30c:指定输出category的名¿UŽÍ¼Œæœ€å¤§çš„宽度æ˜?0åQŒå¦‚æžœcategory的名¿U°å¤§äº?0的话åQŒå°±ä¼šå°†å·¦è¾¹å¤šå‡ºçš„å­—½W¦æˆªæŽ‰ï¼Œä½†å°äº?0的话也不会有½Iºæ ¼ã€?
4)%20.30c:如果category的名¿U°å°äº?0ž®Þp¡¥½Iºæ ¼åQŒåƈ且右寚w½åQŒå¦‚果其名称长于30字符åQŒå°±ä»Žå·¦è¾¹äº¤˜qœé”€å‡ºçš„字符截掉ã€?
  ˜q™é‡Œä¸Šé¢ä¸‰ä¸ªæ­¥éª¤æ˜¯å¯¹å‰é¢Log4j¾l„äšg说明的一个简化;下面¾l™å‡ºä¸€ä¸ªå…·ä½“配¾|®ä¾‹å­ï¼Œåœ¨ç¨‹åºä¸­å¯ä»¥å‚照执行åQ?
  log4j.rootLogger=INFO,A1åQŒB2
  log4j.appender.A1=org.apache.log4j.ConsoleAppender
  log4j.appender.A1.layout=org.apache.log4j.PatternLayout
  log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
  æ ÒŽ®ä¸Šé¢çš„æ—¥å¿—格式,某一个程序的输出¾l“果如下åQ?
  0  INFO 2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]
16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT

4. # 当输å‡ÞZ¿¡æ¯äºŽå›žæ»šæ–‡äšgæ—?
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender //指定以文件的方式输出日志
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log //æ–‡äšg位置,也可以用变量${java.home}、rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB //æ–‡äšg最大尺å¯?
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备䆾�
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

6. Log4j比较全面的配¾|?
  LOG4J的配¾|®ä¹‹½Ž€å•ä‹É它遍及于­‘Šæ¥­‘Šå¤šçš„应用中了:Log4J配置文äšg实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签½{‰å…¨å¥—功能。择其一二ä‹É用就够用了,
log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true
# 应用于控制台
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=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#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
#应用于文�
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=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
# 应用于文件回�
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log //æ–‡äšg位置,也可以用变量${java.home}、rolling.log
log4j.appender.ROLLING_FILE.Append=true //true:æ·ÕdŠ  false:覆盖
log4j.appender.ROLLING_FILE.MaxFileSize=10KB //æ–‡äšg最大尺å¯?
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备䆾�
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#应用于socket
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=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n

# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 发送日志给邮äšg
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# 用于数据�
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 ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %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 = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

]]>
使用log4j的邮件功èƒ?/title><link>http://www.aygfsteel.com/libin2722/articles/287816.html</link><dc:creator>½C¼ç‰©</dc:creator><author>½C¼ç‰©</author><pubDate>Wed, 22 Jul 2009 03:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/libin2722/articles/287816.html</guid><wfw:comment>http://www.aygfsteel.com/libin2722/comments/287816.html</wfw:comment><comments>http://www.aygfsteel.com/libin2722/articles/287816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/libin2722/comments/commentRss/287816.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/libin2722/services/trackbacks/287816.html</trackback:ping><description><![CDATA[Log4jçš„é‚®ä»¶åŠŸèƒ½èƒ½å¤ŸäØ“æˆ‘ä»¬åšè¿™æ ïLš„事情----当程序运行完的时候,或者正在运行也是可以的åQŒå®ƒž®†ç¨‹åºçš„æ—¥å¿—通过邮äšg的方式发åˆîC½ çš„é‚®½Ž×ƒ¸Šã€? <p>    ˜q™æ ·åQŒå¯¹äºŽç¨‹åºè¿è¡Œçš„æŽ§åˆ¶ž®×ƒ¸ç”¨æ¯‹Æ¡éƒ½è·‘到机器上去看日志文件这么麻烦了åQŒæˆ‘们需要的只是åQŒå¼€å¼€FoxmailåQŒç”¨ç”¨é¼ æ ‡ï¼Œž®±å¯ä»¥çŸ¥é“,½E‹åºåˆ°åº•˜qè¡Œçš„æ€Žä¹ˆæ ·äº†ã€?/p><p>    </p><ul><li><h3>    使用log4j-1.2.15</h3></li></ul><p>               之前用的æ˜?log4j-1.2.8 åQŒç…§ç†è¯´åQŒå®ƒä»¬ä¹‹é—´çš„版本åïLš„区别够小åQŒåº”该没有什么区别,但是事实却让我丈二摸不着头脑ã€?/p><p>             发送邮件的一个重要的¾cÀL˜¯SMTPAppenderã€?/p><p>             åœ?.2.8的版本中åQŒSMTPAppender没有smtpPassword å’ŒsmtpUsername 属性。这两个属性分别是ç™Õd½•smtp服务器用的用户名和密码。笔者到现在也没有想明白åQŒåœ¨é€šå¸¸çš„æƒ…况下怎样才可以不ç™Õd½•smtp服务器就可以发送邮件了ã€? 有知道的朋友åQŒå°±ç•™ä¸ª­a€å§ï¼Œå…ˆè°¢˜q‡å•¦ã€?/p><p>              ç”׃ºŽä¸èƒ½è§£å†³ä¸Šé¢çš„那个问题,我就只好使用1.2.15˜q™ä¸ªç‰ˆæœ¬å•¦ã€?/p><ul><li>   log4j.propertiesæ–‡äšg</li></ul><p>            </p><div id="wmqeeuq" class="dp-highlighter"><div id="wmqeeuq" class="bar"><div id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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>           ˜q™ä¸ªæ–‡äšg配好以后åQŒæ­å–œä½ åQŒçŽ°åœ¨log4j的邮件功能,你就可以体会了ã€?/p><ul><li>  SMTPçš„çñ”别默认是ERROR¾U§åˆ«çš„,怎么åŠ?/li></ul><p>             默认的çñ”别是ERROR¾U§åˆ«çš„,那就是说åQŒåªæœ‰ç¨‹åºå‡ºé”™äº†åQŒä½ æ‰å¯ä»¥æ”¶åˆ°é‚®ä»Óž¼Œå¾ˆæ˜¾ç„Óž¼Œ˜q™è¿˜ä¸èƒ½æ»¡èƒö我们日常½Ž¡ç†çš„要求。我们需要自定义的çñ”别ã€?/p><p>            为此åQŒç¬”者ç‘ô承了TriggeringEventEvaluator¾c»ï¼Œè¦†ç›–里面的一个方面,如下所½C?/p><div id="wmqeeuq" class="dp-highlighter"><div id="wmqeeuq" class="bar"><div id="wmqeeuq" 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 id="wmqeeuq" class="annotation">@Override</span><span>  </span></span></li><li><span>    <span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">boolean</span><span> isTriggeringEvent(LoggingEvent arg0) {  </span></span></li><li><span>        <span id="wmqeeuq" 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>   每遇åˆîC¸€ä¸ªè§¦å‘事件就发一ž®é‚®ä»Óž¼</li></ul><p>            SMTPAppender 实现是,每当isTriggeringEventåQˆï¼‰˜q™ä¸ªæ–ÒŽ³•˜q”回true的时候,它都会发送邮件。这æ ïLš„话,一个程序执行下来,每个有能力触发的事äšg都会形成一ž®é‚®ä»¶ã€‚这昄¡„¶ä¸æ˜¯æˆ‘们希望看到的场面ã€?/p><p>            ½W”者ç‘ô承了SMTPAppender¾c»ï¼Œé‡è£…了appendæ–ÒŽ³•。         Â?</p><div id="wmqeeuq" class="dp-highlighter"><div id="wmqeeuq" class="bar"><div id="wmqeeuq" 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 id="wmqeeuq" class="annotation">@Override</span><span>  </span></span></li><li><span>    <span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> append(LoggingEvent event) {  </span></span></li><li><span>  </span></li><li><span>        <span id="wmqeeuq" class="keyword">if</span><span> (!checkEntryConditions()) {  </span></span></li><li><span>            <span id="wmqeeuq" 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 id="wmqeeuq" class="keyword">if</span><span> (</span><span id="wmqeeuq" 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 id="wmqeeuq" class="keyword">if</span><span> (evaluator.isTriggeringEvent(event)) {  </span></span></li><li><span>            <span id="wmqeeuq" class="keyword">if</span><span> (cb.length() > </span><span id="wmqeeuq" class="keyword">this</span><span>.getBufferSize() / </span><span id="wmqeeuq" 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() > this.getBufferSize() / 2) { sendBuffer(); } } }</pre><p>          ˜q™æ ·çš„话åQŒå½“事äšg的个数达到bufferSize的一半的时候就会发一ž®é‚®ä»¶äº†ã€?/p><p>          但是另外一个问题也随之产生了,当程序结束时åQŒè¿˜åœ¨ç¼“冲里面的事äšg是不会被发送出来的。因ä¸ÞZº‹ä»¶æ•°å¾€å¾€æ²¡æœ‰bufferSize的一半ã€?/p><p>          </p><div id="wmqeeuq" class="dp-highlighter"><div id="wmqeeuq" class="bar"><div id="wmqeeuq" 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 id="wmqeeuq" class="keyword">public</span><span>   *****SMTPAppender() {  </span></span></li><li><span>        Runtime.getRuntime().addShutdownHook(<span id="wmqeeuq" class="keyword">new</span><span> Thread() {  </span></span></li><li><span>  </span></li><li><span>            <span id="wmqeeuq" class="annotation">@Override</span><span>  </span></span></li><li><span>            <span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> run() {  </span></span></li><li><span>                <span id="wmqeeuq" class="keyword">if</span><span> (cb.length() > </span><span id="wmqeeuq" 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() > 0) { sendBuffer(); } } }); }</pre><p> </p><p>         ½W”者在构造函æ•îC¸­åQŒæ·»åŠ äº†ä¸€ä¸ªç¨‹åºç»“æŸæ—¶˜qè¡Œçš„线½E‹ï¼Œæ¥å¤„理这个问题ã€?/p><ul><li>  讄¡½®Html格式的输å‡?/li></ul><p>            按照刚刚½W”者给出的配置文äšgåQŒæ‰€äº§ç”Ÿçš„邮件的格式是纯文本的。其实log4j有网™å‰| ¼å¼çš„输出的ã€?/p><p>            </p><div id="wmqeeuq" class="dp-highlighter"><div id="wmqeeuq" class="bar"><div id="wmqeeuq" class="tools">Propertyæ–‡äšg代码 <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æ–‡äšg">log4j.appender.MAIL.layout=org.apache.log4j.HTMLLayout</pre><p> </p><p>          ˜q™æ ·çš„话åQŒé‚®ä»¶å°±å¥½çœ‹å¾ˆå¤šå•¦ã€?/p><ul><li>  解决邮äšg中的中文ä¹Þq é—®é¢˜</li></ul><p>            æœ€åŽï¼Œä½ ä¼šå‘çŽ°ä¸­æ–‡æ˜¯äØ•ç çš„åQŒè€Œä¸”HTMLLayout没有提供¾~–码方式的属性设¾|®ï¼Œå“Žï¼Œåˆæ˜¯ä¸€é˜‰|— è¯­ä¸­ã€?/p><p>           得,½W”者也ž®±åªå¥½å†å†™ä¸€ä¸ªç±»åQŒç‘ô承HTMLLayout,覆盖getContentTypeæ–ÒŽ³•</p><p>           </p><div id="wmqeeuq" class="dp-highlighter"><div id="wmqeeuq" class="bar"><div id="wmqeeuq" 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 id="wmqeeuq" class="annotation">@Override</span><span>  </span></span></li><li><span>    <span id="wmqeeuq" class="keyword">public</span><span> String getContentType() {  </span></span></li><li><span>        <span id="wmqeeuq" class="keyword">return</span><span> </span><span id="wmqeeuq" 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>           æ·ÕdŠ ä¸Šè¿°åŠŸèƒ½ä¹‹åŽçš„é…¾|®æ–‡ä»¶å¦‚下所½Cºï¼š</p><div id="wmqeeuq" class="dp-highlighter"><div id="wmqeeuq" class="bar"><div id="wmqeeuq" 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 id="wmqeeuq" class="annotation">@domain</span><span>.com  </span></span></li><li><span>  </span></li><li><span>log4j.appender.MAIL.From=yourname<span id="wmqeeuq" 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.aygfsteel.com/libin2722/aggbug/287816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/libin2722/" target="_blank">½C¼ç‰©</a> 2009-07-22 11:12 <a href="http://www.aygfsteel.com/libin2722/articles/287816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>比较有用的log4j.propertieshttp://www.aygfsteel.com/libin2722/articles/287815.html½C¼ç‰©½C¼ç‰©Wed, 22 Jul 2009 03:10:00 GMThttp://www.aygfsteel.com/libin2722/articles/287815.htmlhttp://www.aygfsteel.com/libin2722/comments/287815.htmlhttp://www.aygfsteel.com/libin2722/articles/287815.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/287815.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/287815.htmllog4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE
log4j.addivity.org.apache=true

# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=GBK
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

# 用于数据�br />#log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
#log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/ww
#log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
#log4j.appender.DATABASE.user=root 
#log4j.appender.DATABASE.password=123
#log4j.appender.CONSOLE.Threshold=WARN
#log4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread, infolevel,class,messages) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')
# INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
# 写入数据库中的表LOG4Jçš„Message字段中,内容åQ…dåQˆæ—¥æœŸï¼‰%c: 日志信息所在地åQˆç±»åï¼‰%p: 日志信息¾U§åˆ«%m: 产生的日志具体信æ?%n: 输出日志信息换行
#log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
#log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

# 每天新徏日志
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=C:/log4j/log
log4j.appender.A1.Encoding=GBK
log4j.appender.A1.Threshold=DEBUG
log4j.appender.A1.DatePattern='.'yyyy-MM-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n

#应用于文�br />log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=C:/log4j/file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.Encoding=GBK
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

# 应用于文件回�br />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.CONSOLE_FILE.Encoding=GBK
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=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#自定义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 = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#应用于socket
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=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

# 发送日志给邮äšg
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n



]]>
使用相对路径加蝲Log4j配置文äšghttp://www.aygfsteel.com/libin2722/articles/287813.html½C¼ç‰©½C¼ç‰©Wed, 22 Jul 2009 02:59:00 GMThttp://www.aygfsteel.com/libin2722/articles/287813.htmlhttp://www.aygfsteel.com/libin2722/comments/287813.htmlhttp://www.aygfsteel.com/libin2722/articles/287813.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/287813.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/287813.html
URL url  =  UserServiceImpl. class .getResource( " /config/log4j.properties " );
Properties properties 
=   new  Properties();
try  {
     properties.load(
new  InputStreamReader(url.openStream()));
    } 
catch  (IOException e) {
        e.printStackTrace();
    }
PropertyConfigurator.configure(properties);

/config/log4j.properties 可以攑֜¨å¯¹åº”çš„jaræ–‡äšgä¸?/span>


]]>
使用 Web Service Appender for Log4j ½Ž¡ç†æ—¥å¿—¾Uªå½•http://www.aygfsteel.com/libin2722/articles/286831.html½C¼ç‰©½C¼ç‰©Wed, 15 Jul 2009 03:49:00 GMThttp://www.aygfsteel.com/libin2722/articles/286831.htmlhttp://www.aygfsteel.com/libin2722/comments/286831.htmlhttp://www.aygfsteel.com/libin2722/articles/286831.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/286831.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/286831.html使用定制çš?Web Service Appender for Log4j ž®†æ—¥å¿—信息发送到某一集中位置。Log4j Appender 使您可以在面向服务架æž?(SOA) 解决æ–ÒŽ¡ˆä¸­è°ƒè¯•和跟踪ä»ÀL„é—®é¢˜ã€?/blockquote>

引言

ä½? 可以使用 Web Service Appender ž®†æ—¥å¿—集中到某一位置åQŒåŒæ—Óž¼ŒWeb Service Appender 允许½Ž¡ç†è€…监控、开发者调试面向服务架æž?SOA)环境里可能存在的ä»ÖM½•问题。Web Service Appender 是一¿Uæ‰©å±?JAVA ¾c»ï¼Œå®ƒç”± Log4j çš?Appender ¾cÀL‰©å±•而来ã€?/p>

从定义上看,SOA 是一¿Uå½¼æ­¤å¯ä»¥äº’ç›”R€šä¿¡çš„æœåŠ¡é›†åˆï¼Œä½†è¿™äº›æœåŠ¡çš„å†…å®¹æ˜¯å„è‡ªç‹¬ç«‹çš„åQŒæ¯ä¸€¾cÀLœåŠ¡å‡ä¸å—å…¶å®ƒæœåŠ¡å†…å®¹æˆ–æœåŠ¡çŠ¶æ€çš„å½±å“åQŒåƈ且这些服务都工作在分布式的系¾lŸæž¶ 构里。在 SOA 中,Web 服务通常被用来在¾l™å®šäº‹åŠ¡ä¸­å¤„ç†è¯·æ±‚ï¼Œ˜q™äº›è¯äh±‚可以是遗留代码、企业çñ” Java Beans(EJBs) 的封装,也可以是 Java ¾cÈš„ž®è£…åQŒä‹É用一¿Uå¯ä»¥å°†æ—¥å¿—信息聚集在中心位¾|®é‡Œçš„æ—¥å¿—纪录方法,能帮助您隔离¾~ºé™·å’Œé—®é¢˜ï¼Œòq¶èƒ½è®©ä½ æ›´å¥½çš„理解逻辑‹¹çš„处理ã€?

ž®†ç‰¹å®šæ¨¡å—或服务的日志消息纪录到一个中心位¾|®çš„æœºåˆ¶åQŒå¯ä»¥æŠŠå¯èƒ½æ½œåœ¨çš„问题和¾~ºé™·é™ä½Žåˆ°æœ€ž®ã€?/p>

本文å¯?Log4j 的功能进行了大体的概˜qŽÍ¼Œòq¶ä»‹¾läº†å¦‚何¾~–写自定义的 Log4j AppenderåQŒè¿™¾cȝ‰¹ŒDŠçš„ Appender ž®†æ—¥å¿—消息编åˆîC¸€¿Uç‰¹å®šçš„ Web 服务ã€?/p>



回页�/b>


Log4j 快速入�/span>

Log4j 是一¿Uå¼€æ”¾æºä»£ç çš„æ—¥å¿—库åQŒå®ƒå·²è¢«å‘展ä¸?Apache Software Foundation 日志服务™å¹ç›®çš„子™å¹ç›®ã€‚该库是ä»?IBM åœ?90 òq´ä»£æœ«å¼€å‘çš„æ—¥å¿—åº“äØ“åŸºç¡€çš„ï¼Œ½W¬ä¸€ç‰ˆå‘布于 1999 òq´ã€‚现在它在开放源代码团体得到了广泛ä‹É用,它的体系是围¾l•以下三个主要概忉|ž„廸™“v来的åQ?/p>

  • Logger
  • Appender
  • Layout

˜q™äº›æ¦‚念可以让您æ ÒŽ®æ¶ˆæ¯¾cÕdž‹ã€æ¶ˆæ¯ä¼˜å…ˆçñ”来纪录消息,您可以控制消息在何处¾l“束及消息如何格式化ã€? Logger 是应用程序首先调用以初始化消息纪录的对象。当把某一消息传递给日志æ—Óž¼Œlogger 会生æˆ?LoggingEventåQŒå¯¹æ¶ˆæ¯˜q›è¡Œž®è£…。之后,Logger 对象ž®?LoggingEvent 传递给与之兌™”çš?Appenderã€?/p>

Appender ž®?LoggingEvent 所包含的消息发送给指定的目标输出文件。所谓指定的文äšgåQŒå¤§å¤šæ•°æƒ…况下,æ˜?Log4 属性文件。一äº?Appender 存在äº?Log4j 中。您也可以扩å±?AppenderåQŒä‹É之支持其它的目标文äšgåQŒæ¯”å¦?XML æ–‡äšg、控制台½{‰ç­‰ã€?/p>

åœ?Log4j 里, LoggingEvent 被赋予某一¾U§åˆ«åQŒä»¥è¡¨æ˜Žå®ƒä»¬çš„优先çñ”。缺省的¾U§åˆ«åŒ…括如下几种åQ?

  • OFFåQšå¯èƒ½æ˜¯æœ€é«˜çš„¾U§åˆ«åQŒå®ƒæ˜¯ç”¨æ¥å…³é—­æ—¥å¿—纪录的
  • FATALåQšæŒ‡å‡ºçŽ°äº†éžå¸æ€¸¥é‡çš„错误事äšgåQŒè¿™äº›é”™è¯¯å¯èƒ½ä¼šå¯ÆD‡´åº”用½E‹åºå¼‚常中止
  • ERRORåQšæŒ‡è™½æœ‰é”™è¯¯åQŒä½†ä»å…è®¸åº”用程序ç‘ô¾l­è¿è¡?/li>
  • WARNåQšæŒ‡˜qè¡ŒçŽ¯å¢ƒæ½œè—ç€å±å®³
  • INFOåQšæŒ‡æŠ¥å‘Šä¿¡æ¯åQŒè¿™äº›ä¿¡æ¯åœ¨¾_—粒度çñ”别上½Hå‡ºæ˜„¡¤ºåº”用½E‹åºçš„è¿›½E?/li>
  • DEBUGåQšæŒ‡¾l†ç²’度信息事ä»Óž¼Œ¾l†ç²’度信息事件对于应用程序的调试是最有用çš?/li>
  • ALLåQšå¯èƒ½æ˜¯æœ€ä½Žçš„¾U§åˆ«åQŒå…¶ç›®çš„æ˜¯æ‰“开所有日志记å½?/li>
Logger å’?Appender 也被赋予上述的某一¾U§åˆ«åQŒåƈ且仅执行½{‰äºŽæˆ–高于它们自íw«çš„¾U§åˆ«çš„æ—¥å¿—请求。比如,如果一ä¸?Appender 属于 INFO ¾U§åˆ«åQŒè€Œæ—¥å¿—请求属äº?DEBUGåQŒé‚£ä¹?Appender ž®†ä¸ä¼šäØ“¾l™å®šçš„æ—¥å¿—事件写消息ã€?



回页�/b>


客户端组�/span>

客户ç«?log4j.properties æ–‡äšg

客户ç«?log4j.properties æ–‡äšg是一¿Uæ ‡å‡†æ–‡ä»Óž¼Œå®ƒåŒ…含服务或模块使用的所æœ?Appender。Web Service Appender 要求有一ä¸?i>端点åQˆendpointåQ?/i> 属性以指定所使用的日志服务ã€?/p>

清单 1 描述了ä‹Éç”?WebServiceAppender 所必需çš?Web 服务客户ç«?Log4j 属性ã€?黑体昄¡¤ºçš„æ–‡æœ¬æŒ‡æ˜Žäº†ž®†è®¿é—?WebServiceAppender 服务器端çš?Appender。属性文件是使用 Log4j 的基本需求,它可以让您配¾|®åº”用程序以使用多个 Appender 以及 logging severity。一旦应用程序进入运行状态或潜在的问题得到解冻I¼Œæ‚¨å°±å¯ä»¥è½ÀL¾åœîC¿®æ”¹å±žæ€§æ–‡ä»¶ã€?/p>
清单 1åQšå®¢æˆïL«¯ Log4j 的属性文ä»?/b>

#set the level of the root logger
log4j.rootLogger = INFO, CONSOLE
#set own logger
log4j.logger.com.carmelouria.logging.test=CONSOLE
log4j.appender.CONSOLE=com.carmelouria.logging.WebServiceAppender
log4j.appender.CONSOLE.endpoint=
http://localhost:9080/log4j/services/LogAppenderService

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n





回页�/b>


服务器的 Log4j.properties æ–‡äšg

æœ? 务器 Log4j.properties æ–‡äšg被用来关联客æˆïL«¯ Log4j 属性文ä»Óž¼Œå®ƒæŒ‡å®šäº†æ—¥å¿—çš„çñ”别及服务器将如何输出消息。对于支æŒ? Log4j 的应用程序,您可以定义多ä¸?appender。当ç„Óž¼Œ˜q™äº› appender 既可以用于客æˆïL«¯æœåŠ¡åQŒä¹Ÿå¯ä»¥ç”¨äºŽæœåŠ¡æ¨¡å—ã€?/p>

清单 2 描述了一份典型的 Log4j 属性文ä»Óž¼ŒæœåŠ¡å™¨ç«¯çš?WebServiceAppender 使用¾~ºçœçš?Log4j Appenders。服务器端的 Appender 可以潜在的调用另一ä¸?WebServiceAppenderåQŒåƈž®†æ—¥å¿—ä¿¡æ?i>链接èµäh¥åQ?/p>
清单 2åQšæœåŠ¡å™¨ç«¯çš„ Log4j 属性文ä»?/b>

#set the level of the root logger
log4j.rootLogger = INFO, FILE
#set own logger
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.file=c:/temp/log4j/server/server.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n

客户端程序测试示例:

˜q™ä¸ªå®¢æˆ·ç«¯ç¨‹åºç¤ºä¾‹æ˜¯æ— æ ¼å¼æ™®é€?Java 对象(POJO)åQŒå®ƒè®°å½•了一条消息,òq¶è¢«é…ç½®ä¸ÞZ‹Éç”?Web Service Appender 来处理消息ã€?a >清单 3 昄¡¤ºäº†è¿™ä¸ªç¤ºä¾‹ï¼š


清单 3åQšå®¢æˆïL«¯åº”用½E‹åºä½¿ç”¨ WebServiceAppender 的示ä¾?/b>

package com.carmelouria.logging.test;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
* @author Carmelo Uria
*
*/
public class LoggingSample
{
private static Logger logger = Logger.getLogger(LoggingSample.class.getName());
/**
*
*/
public LoggingSample()
{
super();
PropertyConfigurator.configure("c:/temp/log4j.properties");
logger.log(Level.INFO, "LoggingSample instantiation...");
System.out.println("finished...");
}
public static void main(String[] args)
{
LoggingSample sample = new LoggingSample();
}
}





回页�/b>


WebServiceAppender

WebServiceAppender 是必需的,它可以将消息发送到指定çš?Web 服务ã€?code>WebServiceAppender ¾l§æ‰¿äº?org.log4j.AppenderåQŒå®ƒå…è®¸ä½¿ç”¨ log4.propertiesåQŒåÆˆæˆäØ“æœ‰æ•ˆçš?Log4j Appenderã€?/p>

WebServiceAppender 使用åŸÞZºŽ XML 的远½E‹è¿‡½E‹è°ƒç”?(JAX-RPC) çš?Java APIåQŒæ¥ž®†æ¶ˆæ¯å‘送到服务器。JAX-RPC 是一¿Uè§„范,它描˜qîC‹Éç”? RPC å’?XML 构徏 Web 服务å’?Web 服务客户端的应用¾~–程接口 (API) 和约定。JAX-RPC 又被¿UîCØ“ JSR 101ã€?/p>

LoggingEvent 通过 SOAPElement è¢«åˆ†å‰²åÆˆè¡¨ç¤ºä¸?XML。javax.xml.soap.SOAPElement 接口意味着服务端点接口ž®†åŒ…含一个参敎ͼŒæˆ–è¿”å›?javax.xml.soap.SOAPElement ¾cÕdž‹çš„å€û|¼Œä»¥å¯¹åº”于 schema 中每个ä‹Éç”?code><xsd:any/>的地斏V€‚从本质上看åQŒå®ƒæ˜?XML 参数的封装,且没有相应的序列åŒ?反序列化 JAVA ¾c…R€‚例如,一旦客戯‚¯·æ±‚记录一个消息,ž®×ƒ¼šåˆ›å¾ä¸€ä¸?LoggEvent 对象åQŒç„¶åŽä¼ é€ç»™ Appender。在˜q™ç§æƒ…况下,Appender ž®±æ˜¯ WebServiceAppender。Appender ‹‚€ç´¢äº‹ä»Óž¼Œòq¶åœ¨è§£æžäº‹äšg中的信息。一些额外的信息会被加入åQŒå¦‚ä¸ÀLœºåç§°åQŒè¿™æ äh‚¨ž®ÞqŸ¥é“这些消息来自哪个系¾lŸã€‚同æ—Óž¼Œappend æ–ÒŽ³•也将消息转换ä¸?SOAPElementåQŒè¿™æ ·å°±å¯ä»¥é€šè¿‡ executeWebService æ–ÒŽ³•ž®†æ¶ˆæ¯ä¼ é€’ç»™ Web 服务。ä‹Éç”?SOAPElement 充分考虑äº?WebServiceAppender 未来版本的可扩展性问题ã€?/p>
清单4åQ𿉧è¡?WebServiceAppender 服务çš?Append æ–ÒŽ³•

protected void append(LoggingEvent event)
{
// create Web Service client using endpoint
if (endpoint == null)
{
System.out.println("no endpoint set. Check configuration file");
System.out.println("[" + hostname + "] " + this.layout.format(event));
return;
}
executeWebService(event);
}
private void executeWebService(LoggingEvent event)
{
SoapClient client = new SoapClient();
URL endPoint = null;
try
{
endPoint = new URL(getendpoint());
}
catch (MalformedURLException e1)
{
e1.printStackTrace();
}
String nameSpace = "http://ejb.logging.carmelouria.com";
QName serviceName = new QName(nameSpace, "LogAppenderServiceService");
QName operation = new QName(nameSpace, "log");
QName port = new QName(nameSpace, "LogAppenderService");
Parameter message =
new Parameter("log", Constants.XSD_ANY, SOAPElement.class, ParameterMode.IN);
try
{
/**
*create SOAPElement from LoggingEvent need hostname
*/
Level level = event.getLevel();
String sysLog = "<syslog>" + new Integer(level.getSyslogEquivalent()).toString()
+ "</syslog>";
String startTime = new Long(LoggingEvent.getStartTime()).toString();
String timeTag = "<start_time>" + startTime + "</start_time>";
String hostName = "<hostname>" + InetAddress.getLocalHost() +
"</hostname>";
String threadName = "<thread_name>" + event.getThreadName()
+"</thread_name>";
String logger = "<logger>" + event.getLoggerName() + "</logger>";
String eventMessage = "<message>" + event.getRenderedMessage() +
"</message>";
String log = hostName + threadName + logger + timeTag + sysLog +
eventMessage;
String throwableInformation[] = event.getThrowableStrRep();
if (throwableInformation != null)
{
for (int i = 0; i < throwableInformation.length; i++)
{
String throwable = "<throwable_information>" + throwableInformation[i] +
"</throwable_information>";
log += throwable;
}
}
String ndcString = event.getNDC();
if (throwableInformation != null)
{
String throwable = <ndc>" + ndcString + </ndc>";
log += throwable;
}
message.setValue(SOAPElementFactory.create(<log>" + log + </log>"));
}
catch (UnknownHostException unknownHostException)
{
unknownHostException.printStackTrace();
}
catch (SOAPException e2)
{
e2.printStackTrace();
}
Parameter resultType = newParameter("logResponse",
Constants.WEBSERVICES_VOID,
Object.class,
ParameterMode.OUT);
Parameter[] parameters = { message };
try
{
// execute client
Object result =
client.execute(endPoint, serviceName, operation, "wrapped", null,
port, resultType, parameters);
if ((result != null) && (result instanceof String))
System.out.println((String) result);
}
catch (ClientException e)
{
e.printStackTrace();
}
}

Hostname

不幸的是åQŒLog4j çš?LoggingEvent 没有包含 HostnameåQŒè€?Hostname æ˜?Web Service Appender 众多需求之一。在创徏 SOAPElement 以前åQŒæ‚¨å¯ä»¥ç”¨ä¸‹é¢çš„语句ž®?Hostname æ·ÕdŠ åˆ?XML æ–‡äšg里:

String hostName = "<hostname>" + InetAddress.getLocalHost() + "</hostname>";

SoapElementFactory

SoapElementFactory 是主要用于创å»?SOAPElement 的类。它同时支持创徏 IBM å’?Java çš?SOAPElement 实现åQŒå¦‚清单 5 所½Cºï¼š


清单 5åQšä‹Éç”?SoapElementFactory ¾cȝš„创徏æ–ÒŽ³•

public static javax.xml.soap.SOAPElement create(String xml) throws SOAPException
{
com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory factory =
(com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory)
com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory
.newInstance();
SOAPElement element =
(javax.xml.soap.SOAPElement)factory.createElementFromXMLString(xml);
return(element);
}
public static SOAPElement create(String arg0, String arg1, String arg2,
boolean ibmSoapElement) throws
SOAPException
{
if (ibmSoapElement)
{
SOAPFactory soapFactory =
(com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory)
com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory.newInstance();
return (soapFactory.createSOAPElement(arg0, arg1));
}
javax.xml.soap.SOAPFactory soapFactory =
javax.xml.soap.SOAPFactory.newInstance();
return (soapFactory.createElement(arg0, arg1, arg2));
}

SoapClient

SoapClient ¾cÕd°è£…了 Call 接口çš?JAX-RPC 实现åQŒjavax.xml.rpc.Call 接口提供了对服务端点动态调用的支持。javax.xml.rpc.Service 接口ž®±å¥½è±¡æ˜¯åˆ›å¾ Call 实例的工厂ã€?/p>

清单 6 说明了客æˆïL«¯å¦‚何动态调用服务。这允许å¯ÒŽœåŠ¡è¿›è¡Œå˜æ›ß_¼Œè€Œæ— éœ€ç”Ÿæˆå®¢æˆ·ç«¯ä»£ç†æ¥è®‰K—®˜qœç¨‹æœåŠ¡ã€?/p>
清单 6åQšä‹Éç”?SoapClient ¾cȝš„调用æ–ÒŽ³•

private Object call(SoapService service, QName operation, QName portType,
String operationStyleProperty,
String encodingURIProperty, Parameter returnType,
Parameter[] parameters) throws ClientException
{
QName portName;
String response = null;
Object results = null;
Call call = null;
try
{
// check to see if Service object exists
if (service == null)
throw new ClientException("Invalid Service object. It maybe null.");
// retrieve call from Service object
call = service.createCall();
call.setOperationName(operation);
call.setPortTypeName(portType);
// check call object
if (call == null)
throw new ClientException("invalid operation. Call object is null.");
// set default values
if (operationStyleProperty == null)
call.setProperty(Call.OPERATION_STYLE_PROPERTY,
OPERATION_STYLE_DOCUMENT_TYPE);
else
call.setProperty(Call.OPERATION_STYLE_PROPERTY,
operationStyleProperty);
if (encodingURIProperty == null)
call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY,
ENCODING_LITERAL);
else
call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY,
encodingURIProperty);
call.setTargetEndpointAddress(service.getServiceEndPoint());
//create Parameter class for SoapClient
for (int i = 0; i < parameters.length; i++)
{
Class classObject = parameters[i].getClassObject();
if (classObject != null)
call.addParameter(parameters[i].getName(), parameters[i].getXmlType(),
parameters[i].getClassObject(), parameters[i].getMode());
else
call.addParameter(parameters[i].getName(), parameters[i].getXmlType(),
parameters[i].getMode());
}
// pass parameter as ReturnType
if (returnType != null)
{
if (returnType.getClassObject() != null)
call.setReturnType(returnType.getXmlType(), returnType.getClassObject());
else
call.setReturnType(returnType.getXmlType());
}
Object[] request = new Object[parameters.length];
// add parameter values
for (int i = 0; i < request.length; i++)
{
request[i] = parameters[i].getValue();
}
results = call.invoke(request);
}
catch (SOAPFaultException e)
{
System.out.println(e.getFaultString());
e.getStackTrace();
throw new ClientException(e.getLocalizedMessage(), e);
}
catch (ServiceException serviceException)
{
serviceException.getStackTrace();
throw new ClientException(serviceException.getLocalizedMessage(),
serviceException);
}
catch (RemoteException exception)
{
exception.printStackTrace();
throw new ClientException(exception.getLocalizedMessage(), exception);
}
return (results); }





回页�/b>


服务¾l„äšg

Log4j.server.properties

Log4j.server.properties æ–‡äšg包含了一个基本的 Log4j 配置文äšgåQŒè¯¥æ–‡äšg可以让您指定把哪些日志发送给 Web 服务¾pȝ»Ÿã€?/p>
清单 7åQšLog4j.server.properties æ–‡äšg

#set the level of the root logger
log4j.rootLogger = INFO, FILE
#set own logger
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.file=c:/temp/log4j/server/server.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n

LogAppenderBean.java

LogAppenderBean.java æ˜?Web Service Appender 服务所要ä‹É用的 EJB。该服务启动 LogAppenderBean 以处理来自每ä¸?Web Service Appender 客户端的每一个请求ã€?/p>

清单 8 昄¡¤ºäº†æ¥è‡?WebServiceAppender EJB çš?log æ–ÒŽ³•åQŒè¯¥æ–ÒŽ³•解析来自客户端的消息åQŒåƈž®†å®¢æˆïL«¯ä¿¡æ¯¾Uªå½•到服务的服务器端ã€?/p>
清单 8åQšLogAppenderBean çš?log æ–ÒŽ³•

public void log(SOAPElement message)
{
try
{
InputSource source = ((IBMSOAPElement)
message).toInputSource(false);
Document document = Parser.parse(source);
String log = null;
String hostname =
document.selectSingleNode("http://hostname").getText();
String threadName =
document.selectSingleNode("http://thread_name").getText();
String syslog =
document.selectSingleNode("http://syslog").getText();
String startTime = new Long(
document.selectSingleNode("http://start_time").
getText()).toString();
log = '[' + startTime + ':' + hostname + ':' + threadName +
"] " + document.selectSingleNode(
"http://message").getText();
// retrieve any throwable messages
List throwableList = document.selectNodes(
"http://throwable_information");
if(throwableList != null)
{
Iterator throwables = throwableList.iterator();
while(throwables.hasNext())
{
log += '\n' + ((Node)throwables.next()).getText();
}

log += '\n';
}

logger.log(Level.toLevel(new Integer(syslog).intValue()),
log);
logger.log(Level.INFO,log);
}
catch(ParserException parseException)
{
parseException.printStackTrace();
}
catch (SAXException e)
{
e.printStackTrace();
}
}

通过 IBM SOAPElement çš?InputSourceåQŒæ¯ä¸€ä¸?SOAPElement 的内定wƒ½ä¼šè¢«‹‚€ç´¢ã€‚目前,只有 IBM WebSphere] Application Server (Application Server) 支持˜q™äº›ä»£ç åQˆè¯·å‚阅参考资æ–?/a>åQ‰ã€?然而,如果您移é™?IBM SOAPElementåQŒé‚£ä¹ˆæ‚¨ž®±å¯ä»¥åœ¨ä»ÖM½•应用服务器上使用˜q™äº›ä»£ç ã€‚IBM SOAPElement 内置的性能优化也适用äº?Application Serverã€?/p>

每一ä¸?SOAPElement 都ä‹Éç”?Dom4j 来读取、解析和转换。Dom4j 是一¿Uåœ¨å†…存中表½C?XML 树的对象模型。Dom4j 提供了一¾l„易于ä‹É用的 APIåQŒä»Žè€Œäؓ我们提供了一整套强大的功能来处理、操作或定位 XMLåQŒä‹Éç”?XPath å’?XSLT ˜q›è¡Œå·¥ä½œåQŒä»¥åŠä¸Ž SAXã€? JAXP、DOM 集成ã€?/p>

除了可以使用ä»ÀL„çš?XML 解析器外åQŒDOM4J ˜q˜å…è®æ€‹É用ä“Q意的 SAX 解析器,为实现更好的性能åQŒè¿˜å…è®¸ä½¿ç”¨æ‰€æœ‰æ ‡å‡†çš„ XSLT 转换器ã€? 转换被用来析取发送给 Web Service Appender 的客æˆïL«¯ LoggingEvent 的元素ã€?/p>

å¦‚æžœæ‚¨å…è®æ€‹Éç”?SOAPElementåQŒé‚£ä¹ˆå°±éœ€è¦åœ¨ä»£ç ä¸­ç»´æŒæœ€å¤§é™åº¦çš„灉|´»æ€§ã€‚Web Service Appender 服务可以被修改,以支持所有发送给服务çš?XMLã€?





回页�/b>


输出

下面的示例展½CÞZº† Web Service Appender 的可能的输出åQ?/p>

INFO [WebContainer : 0] ejb.LogAppenderBean (log:?) :: [1111513482641:OO7-64BIT/9.48.114.183:main]LoggingSample instantiation...

OO7-64BIT/9.48.114.183 是机器名å’?IP 地址åQŒè€?main 是日志所在处的方法名ã€?/p>



回页�/b>


¾l“束è¯?/span>

Web Service Appender 是将日志集中到某一位置的基本工兗÷€‚ç”±äº?Web Service Appender æ˜?Log4j çš? Appender ¾cȝš„子集åQŒå› è€Œé…¾|®å’Œä½¿ç”¨ Appender 都非常简单易懂。您可以修改 Log4j 的属性文ä»Óž¼Œ˜q™æ ·åQŒä‹Éç”?Log4j 的现有应用程序和服务ž®±å¯ä»¥é©¬ä¸Šä‹Éç”?Web Service Appenderã€?/p>




回页�/b>


下蝲

描述名字大小下蝲æ–ÒŽ³•
Foundation Class Libraryfoundation.zip47 KBHTTP
Logging Web Service J2EE ApplicationLoggingWebService.ear1976 KBHTTP
Unit Test Sample CodeSoapClientTest.java5 KBHTTP


]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÉÐÒåÏØ| °¢À­ÉÆÃË| ÓÀÐÞÏØ| ·¿²ú| ¸ÊÈªÏØ| Îâ½­ÊÐ| ºÓÔ´ÊÐ| ºÓ³ØÊÐ| ¸»Ô£ÏØ| Т¸ÐÊÐ| ÎâÆìÏØ| ÁÙ°²ÊÐ| ÊÕ²Ø| ÁéÊÙÏØ| ¿ªÂ³ÏØ| °ö²ºÊÐ| Ñô´ºÊÐ| ¹ÅÕÉÏØ| ¿ªÑôÏØ| ³¤Ô«ÏØ| Æ½Ì¶ÏØ| ÍòÊ¢Çø| Ñô´ºÊÐ| Ì©ºÍÏØ| ËÄ×ÓÍõÆì| µÂ»ÝÊÐ| ÎâÇÅÏØ| »ôÁÖ¹ùÀÕÊÐ| פÂíµêÊÐ| ÕýÄþÏØ| ÈÙ²ýÏØ| °¢À­ÉÆ×óÆì| ÔÆÄÏÊ¡| ¶õ¶û¶à˹ÊÐ| ÍþÄþ| ËÕÄáÌØ×óÆì| À×É½ÏØ| ºº¹ÁÇø| ÎĵÇÊÐ| ÐËÎÄÏØ| ÓªÉ½ÏØ|