ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>日本不卡一二三,成人毛片av在线,国产人久久人人人人爽http://www.aygfsteel.com/jackybu/category/4769.html<a ><b><font color=red>共有<script src=http://fastonlineusers.com/online.php?d=jackybu.blogjava.net></script>人在同时阅读此Blog</font></b></a>zh-cnWed, 28 Feb 2007 04:17:59 GMTWed, 28 Feb 2007 04:17:59 GMT60有效地记录日志可以简化企业的开发过½E?/title><link>http://www.aygfsteel.com/jackybu/articles/19545.html</link><dc:creator>è¾?/dc:creator><author>è¾?/author><pubDate>Sun, 13 Nov 2005 00:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/jackybu/articles/19545.html</guid><wfw:comment>http://www.aygfsteel.com/jackybu/comments/19545.html</wfw:comment><comments>http://www.aygfsteel.com/jackybu/articles/19545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jackybu/comments/commentRss/19545.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jackybu/services/trackbacks/19545.html</trackback:ping><description><![CDATA[提前规划一个记录日志的计划åQŒåœ¨å¼€å‘过½E‹åŽæœŸå°±å¯ä»¥èŽïL›Š ¾U§åˆ«: 中çñ” Charles Chan , 首席™åùN—®, Ambrose Software Inc. 2005 òq?9 æœ?05 æ—? 在企业çñ”的开发过½E‹ä¸­åQŒæˆ‘们不可避免地会碰到很多问题;如果您希望在开发过½E‹çš„后期能够有效地捕æ?bugåQŒé‚£ž®±éœ€è¦ä¸€¿Uæœ‰æ•ˆçš„æ—¥å¿—½{–略。但是在一个企业的应用½E‹åºä¸­è¦æƒ›_®žçŽ°æœ‰æ•ˆåœ°è®°å½•æ—¥å¿—åQŒéœ€è¦è¿›è¡Œä¸€ç•ªè§„划,òq¶è®¾è®¡ä¸€äº›å‡†åˆ™ã€‚在本文中,™åùN—® Charles Chan ž®†å‘您介¾lä¸€äº›æœ€å¥½çš„实践åQŒä»Žè€Œå¸®åŠ©æ‚¨ä»Žé¡¹ç›®ä¸€å¼€å§‹å°±¾~–写有用的日志代码ã€? 如果您是一名开发äh员,那您很可能就已经å…ähœ‰˜q™ç§¾léªŒåQšæ‚¨å·²ç»å¼€å‘äº†ä¸€äº›ä»£ç ä»¥åŠä¸€äº›æµ‹è¯•ç”¨ä¾‹ã€‚åº”ç”¨ç¨‹åºç»˜q‡äº†ä¸¥æ ¼çš?QA ‹¹‹è¯•åQŒæ‚¨¼‹®ä¿¡ä»£ç å¯ä»¥å®Œå…¨é€‚合业务的需求。然而,在将应用½E‹åºæœ€¾lˆäº¤ä»˜ç»ˆç«¯ç”¨æˆïLš„æ‰‹é‡Œæ—Óž¼Œå´ä¼šå‡ºçŽ°ä¸€äº›é¢„æƒ³ä¸åˆ°çš„é—®é¢˜ã€‚å¦‚æžœæ²¡æœ‰é€‚å½“çš„æ—¥å¿—æ¶ˆæ¯ï¼Œå¯èƒ½éœ€è¦èŠ±è´¹å‡ å¤©çš„æ—‰™—´æ¥è¯Šæ–­è¿™äº›é—®é¢˜ã€‚不òq¸çš„æ˜¯ï¼Œå¤§éƒ¨åˆ†é¡¹ç›®å¯¹äºŽæ—¥å¿—都没有一个清晰的½{–略。如果没有这¿Uç­–略,¾pȝ»Ÿäº§ç”Ÿçš„æ—¥å¿—消息就有可能无益于问题的分析和解决。在本文中,我们ž®†è®¨è®ÞZ¼ä¸šåº”用程序日志的各个斚w¢çš„问题。您ž®†çœ‹åˆîC¸€ä¸?Javaâ„?òq›_°ä¸Šæ—¥å¿?API 的概˜qŽÍ¼Œå­¦ä¹ ä¸€äº›æœ€å¥½çš„¾~–写日志代码的实践,òq¶äº†è§£å¦‚果需要在产品环境中对详细日志重新˜q›è¡ŒæŽ’序åQŒåº”该如何处理ã€? 选择日志 API 在ä‹Éç”?Java òq›_°˜q›è¡Œå¼€å‘æ—¶åQŒå¯ä»¥ä‹É用两个主要的日志 APIåQšApache Log4J å’?Java Logging APIåQŒåœ¨ 1.4 及更高版本的 Java òq›_°ä¸­éƒ½æä¾›äº†è¿™ä¸¤ä¸ª API。与 Java Logging API 相比åQŒLog4J 更加成熟åQŒç‰¹æ€§ä¹Ÿæ›´åŠ ä¸°å¯Œã€‚è¿™ä¸¤ä¸ªæ—¥å¿—çš„å®žçŽ°éƒ½é‡‡ç”¨äº†ä¸€ä¸ªç±»ä¼¼çš„è®¾è®¡æ¨¡å¼åQˆå¦‚å›?1 所½Cºï¼‰ã€‚除非您的公叔R™åˆ¶è¦ä½¿ç”¨½W¬ä¸‰æ–¹çš„库,否则我强烈徏议ä‹Éç”?Log4J。如果您不能军_®šä½¿ç”¨å“ªä¸ª APIåQŒå°±å¯ä»¥ä½¿ç”¨ Apache Commons Logging APIåQŒå®ƒå¯¹åº•层的日志实现˜q›è¡Œäº†å°è£…。从理论上来è¯ß_¼Œ˜q™æ ·ä¸ç”¨ä¿®æ”¹ä»£ç ž®±å¯ä»¥è¿›è¡Œæ—¥å¿—实现的切换。然而,实际上您很少会切换日志的实现åQ›å› æ­¤ï¼Œæˆ‘ä¸å»ø™®®ä½¿ç”¨ Apache Commons Logging APIåQŒå› ä¸ºå®ƒçš„å¤æ‚æ€§åÆˆä¸æ²¡æœ‰ç»™æ‚¨å¸¦æ¥å…¶ä»–ç‰¹æ€§ã€? 回页é¦? 日志概述 Log4J å’?Java Logging API 都采用了¾cÖM¼¼çš„设计和使用模式åQˆå¦‚å›?1 和清å?1 所½Cºï¼‰ã€‚消息首先被创徏åQŒç„¶åŽä¼ é€’给一个具有特定优先权的日志对象。这些消息的目的和格式是ç”Þp¾“出处理程序及其布局所军_®šã€? å›?1. 日志实现的主要组ä»? 日志实现的主要组ä»? 清单 1. 日志对象的实例化和ä‹Éç”? import org.apache.log4j.Logger; public class MyClass { /* * Obtain a logger for a message category. In this case, the message category is * the fully qualified class name of MyClass. */ private static final Logger logger = Logger.getLogger(MyClass.class.getName()); ... public void myMethod() { ... if (logger.isDebugEnabled()) { logger.debug("Executing with parameters: " + param1 + ":" + param2); } } } 一个好的日志实çŽîC¸­æä¾›äº†å¾ˆå¤šä¸åŒçš„输出处理½E‹åºåQŒæœ€å¸¸è§çš„æ–‡ä»¶è¾“出处理程序和¾lˆç«¯è¾“出处理½E‹åºã€‚Log4J ˜q˜æä¾›äº†ä¸€äº›å¤„理程序将消息发布åˆîC¸€ä¸?JMS 主题中,或者将消息插入一个数据库表中。尽½Ž¡è¿™¾~–å†™ä¸€ä¸ªå®šåˆ¶çš„é™„åŠ å™¨åÆˆä¸å›°éš¾ï¼Œä½†æ˜¯¾~–写和维护这¿Uä»£ç çš„æ€ÖM½“成本不应低估。消息的格式可以通过 Layout 对象˜q›è¡Œé…ç½®ã€‚最常见çš?layout 对象æ˜?PatternLayoutåQŒå®ƒæ ÒŽ®æ‰€æä¾›çš„æ¨¡å¼å¯¹æ¶ˆæ¯˜q›è¡Œæ ¼å¼åŒ–ã€? 清单 2 ¾l™å‡ºäº†ä¸€ä¸?Log4J 的样例配¾|®æ–‡ä»Óž¼Œå®ƒè´Ÿè´£é…¾|?FileAppender。在˜q™ç§é…ç½®ä¸­ï¼Œcom.ambrosesoft.log.MyClass ¾cÖM¸­çš„错误消息被发送给 FileAppenderåQŒåŽè€…将其写入一个名ä¸?log.txt 的文件中。这些消息是æ ÒŽ®ä¸Žè¿™ä¸ªæ·»åŠ å™¨ç›¸å…³çš?layoutåQˆåœ¨˜q™ç§æƒ…况中是 PatternLayoutåQ‰è¿›è¡Œæ ¼å¼åŒ–çš„ã€? 清单 2. Log4J XML 配置样例文äšg <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="fileAppender" class="org.apache.log4j.FileAppender"> <param name="File" value="log.txt"/> <param name="Append" value="true"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %p - %m%n"/> </layout> </appender> <category name="com.ambrosesoft.log.MyClass"> <priority value="error"/> <appender-ref ref="fileAppender"/> </category> <root> <priority value="debug"/> <appender-ref ref="fileAppender"/> </root> </log4j:configuration> 回页é¦? 日志最佛_®žè·? 关于日志åQŒæ‚¨è¦åšçš„一个最重要的选择可能是确定一¿Uæ¨¡å¼ï¼Œž®†æ¯ä¸ªæ—¥å¿—消息分配给一个特定的 ¾cÕdˆ«ã€‚常见的一¿Uå®žè·‰|˜¯ä½¿ç”¨æ¯ä¸ª¾cȝš„全名åQŒè¿™äº›ç±»çš„æ“ä½œä¼šè¢«ä½œä¸ÞZ¸€ä¸ªæ¶ˆæ¯ç±»åˆ«åœ¨æ—¥å¿—中记录(正如我们在清å?1 ä¸­çœ‹åˆ°çš„ä¸€æ øP¼‰åQŒè¿™æ˜¯å› ä¸ø™¿™å¯ä»¥è®©å¼€å‘äh员更¾l†ç²’度地记录每个¾cȝš„讄¡½®ã€‚然而,˜q™åªæœ‰åœ¨ä½¿ç”¨æ—¥å¿—消息来跟ítªæ‰§è¡Œè¿‡½E‹æ—¶æ‰èƒ½è‰¯å¥½åœ°å·¥ä½œã€‚在企业¾U§çš„应用½E‹åºä¸­ï¼Œæœ‰å¾ˆå¤šå…¶ä»–类型的日志消息。ä‹D例来è¯ß_¼Œä¸€æ¡æ—¥å¿—消息可能是为安全顾问äñ”生的åQŒè€Œå¦å¤–一条日志消息则可能是会ä¸ÞZº†å¸®åŠ©˜q›è¡Œæ€§èƒ½è°ƒä¼˜è€Œäñ”生的。如果这两条消息所å…Ïx³¨çš„æ˜¯åŒä¸€ä¸ªç±»åQŒè¿™æ ·å°±ä¼šè¢«åˆ†é…¾l™ç›¸åŒçš„¾cÕdˆ«åQŒè¿™ž®†å¾ˆéš‘Öœ¨æ—¥å¿—输出¾l“果中对其进行区分ã€? ä¸ÞZº†é¿å…˜q™ä¸ªé—®é¢˜åQŒåº”用程序应该具有一¾l„专用的日志记录½E‹åºåQŒå®ƒä»¬éƒ½˜q›è¡Œäº†ç‹¬ç‰¹çš„分类åQŒå¦‚清单 3 所½Cºã€‚每个日志记录程序都可以配置自己的优先çñ”和输出处理程序。例如,安全性日志记录程序可以在ž®†æ—¥å¿—写入目的地之前å¯Ò޶ˆæ¯è¿›è¡ŒåŠ å¯†ã€‚æœ‰æ—¶åº”ç”¨ç¨‹åºçš„è®¾è®¡è€…åº”è¯¥ä¸Žä½¿ç”¨æ—¥å¿—çš„ç”¨æˆøP¼ˆä¾‹å¦‚安全™åùN—®åQ‰ä¸€èµäh¥å•†è®¨æ—¥å¿—的输出格式,从而对˜q™äº›æ¶ˆæ¯˜q›è¡Œæ›´å¥½çš„æŽ§åˆ¶ã€? 清单 3. 专用的日志记录程åº? import org.apache.log4j.Logger; public interface Loggers { Logger performance = Logger.getLogger("performance"); Logger security = Logger.getLogger("security"); Logger business = Logger.getLogger("business"); } ... public class MyClass { .... if (Loggers.security.isWarnEnabled()) { Loggers.security.warn("Access denied: Username [" + userName + "] ..."); } ... } 选择日志的çñ”åˆ? 一ä¸?¾cÕdˆ« åQˆä¾‹å¦?securityåQ‰ä¸­çš„æ¶ˆæ¯å¯ä»¥å…·æœ‰ä¸åŒçš„ 优先¾U§ã€‚有些消息是ä¸ÞZº†è°ƒè¯•而äñ”生的åQŒæœ‰äº›æ˜¯ä¸ÞZº†è­¦å‘Šè€Œäñ”生的åQŒæœ‰äº›åˆ™æ˜¯å‡ºçŽ°é”™è¯¯è€Œäñ”生的。消息的不同优先¾U§å¯ä»¥é€šè¿‡è®°å½• ¾U§åˆ« 来äñ”生。最常用的日志çñ”别有åQ? * Debug: ˜q™ä¸ª¾U§åˆ«çš„æ¶ˆæ¯ä¸­åŒ…含了非常广泛的上下文信息。通常用于问题诊断ã€? * Info: ˜q™äº›æ¶ˆæ¯åŒ…含了一些有助于在äñ”品环境中åQˆç²’度较¾_—)帮助跟踪执行˜q‡ç¨‹çš„上下文消息ã€? * Warning: 警告消息åQŒè¯´æ˜Žç³»¾lŸä¸­å¯èƒ½å­˜åœ¨é—®é¢˜ã€‚例如,如果˜q™ä¸ªæ¶ˆæ¯¾cÕdˆ«æ˜¯æœ‰å…›_®‰å…¨æ€§æ–¹é¢çš„åQŒé‚£ä¹ˆå¦‚果检‹¹‹åˆ°å­—å…¸æ”Õd‡»åQŒå°±åº”该产生一条警告消息ã€? * Error: 错误消息说明¾pȝ»Ÿä¸­å‡ºçŽîCº†ä¸¥é‡çš„问题。这¿Ué—®é¢˜é€šå¸¸éƒ½æ˜¯ä¸å¯æ¢å¤çš„,需要äh工进行干预ã€? 标准çš?Java Logging API å’?Apache Log4J 在此之外又提供了一些日志çñ”别。日志çñ”别的主要目标是帮助您˜q‡æ×oæœ‰ç”¨ä¿¡æ¯ä¸­çš„å™ªå£°ã€‚äØ“äº†é˜²æ­¢å‡ºçŽîC‹É用错误的¾U§åˆ«ä»¥åŠé™ä½Žæ—¥å¿—消息的效用的情况åQŒåœ¨å¼€å§‹ç¼–码之前,必须为开发äh员提供一个清晰的指导斚w’ˆã€? 日志消息的格å¼? 一旦选定日志记录½E‹åºòq¶å¾ç«‹è“v日志¾U§åˆ«ä¹‹åŽåQŒå°±å¯ä»¥å¼€å§‹æž„建日志消息了。在˜q™æ ·åšæ—¶åQŒé‡è¦çš„æ˜¯è¦åŒ…含ž®½å¯èƒ½å¤šçš„上下文信息åQŒä¾‹å¦‚用æˆähä¾›çš„参数åQŒå…¶ä»–应用程序的状态信息。记录日志对象的一¿Uæ–¹æ³•是ž®†å®ƒä»¬è{换成 XML。第三方库,例如 XStreamåQˆè¯·å‚阅 参考资料)可以自动ž®?Java 对象转换æˆ?XML 。尽½Ž¡è¿™æ˜¯ä¸€¿Uéžå¸¸å¼ºå¤§çš„æœºåˆ¶åQŒä½†æ˜¯æˆ‘们必™å»è¦è€ƒè™‘在速度与详¾l†ç¨‹åº¦ä¹‹é—´è¾¾åˆîC¸€¿Uåã^衡。除了典型的应用½E‹åºçŠ¶æ€ä¿¡æ¯ä¹‹å¤–ï¼Œ˜q˜åº”该记录以下信息: * ¾U¿ç¨‹ ID: 企业¾U§çš„应用½E‹åºé€šå¸¸éƒ½æ˜¯åœ¨å¤š¾U¿ç¨‹çš„环境中˜qè¡Œçš„。ä‹É用线½E?ID 信息åQŒæ‚¨ž®±å¯ä»¥å°†å¤šä¸ªè¯äh±‚区分开来ã€? * 调用½E‹åºçš„æ ‡è¯? 调用½E‹åºçš„æ ‡è¯†ä¹Ÿæ˜¯éžå¸”R‡è¦çš„信息。由于不同的用户å…ähœ‰ä¸åŒçš„特权,它们的执行èµ\径也可能会有很大的不同。将用户的标识放到日志消息中åQŒè¿™å¯¹äºŽå¯¹å®‰å…¨æ€§æ•æ„Ÿçš„应用½E‹åºæ˜¯éžå¸¸å¤§çš„一个帮助ã€? * æ—‰™—´æˆ? 通常来说åQŒç”¨æˆ·åªèƒ½è¿‘似地知道问题发生的时间。如果没有时间戳åQŒå°±å¾ˆéš¾è®©åˆ«äººæ¥åˆ¤æ–­é—®é¢˜çš„原因所在ã€? * 源代码信æ? ˜q™åŒ…括类名、方法名和行受÷€‚除非您非常å…Ïx³¨å®‰å…¨æ€§ï¼Œå¦åˆ™æˆ‘徏议您保留调试标记åQ?gåQ‰ï¼Œå³ä‹É在编译äñ”品时也是如此。如果没有调试标讎ͼŒJava ¾~–译器就会删除所有的行号信息åQŒä»Žè€Œæžå¤§åœ°å‡å°‘日志消息的可用性ã€? 上面˜q™äº›ä¿¡æ¯åQˆé™¤äº†è°ƒç”¨ç¨‹åºæ ‡è¯†ï¼‰éƒ½æ˜¯ç”±æ—¥å¿—å®žçŽ°è‡ªåŠ¨èŽ·å–çš„ã€‚äØ“äº†å°†˜q™äº›ä¿¡æ¯åŒ…含到消息中åQŒæ‚¨åªéœ€è¦äؓ输出处理½E‹åºé…ç½®ä¸€ä¸ªé€‚当çš?layout 模式卛_¯ã€‚要捕获调用者的标识åQŒæ‚¨å¯ä»¥åˆ©ç”¨ Log4J 中的诊断上下文特性(更多信息请参é˜?参考资料)。诊断上下文让您可以ž®†ä¸Šä¸‹æ–‡ä¿¡æ¯ä¸Žå½“前正在运行的¾U¿ç¨‹å…Œ™”在一赗÷€‚è¿™äº›ä¿¡æ¯å¯ä»¥åœ¨ä¸ø™¾“凸™¿›è¡Œæ ¼å¼åŒ–的同时而包含到每条消息中ã€? åœ?J2EE Web 应用½E‹åºä¸­ï¼Œåº”用逻辑ž®†ç”¨æˆäh ‡è¯†ä¿å­˜åˆ°è¯Šæ–­ä¸Šä¸‹æ–‡ä¸­æœ€å¥½çš„地方是在一ä¸?servlet ˜q‡æ×o器中。清å?4 中显½CÞZº†è¦å®žçŽ°è¿™¿UåŠŸèƒ½çš„å¿…è¦ä»£ç ã€‚å®ƒä½¿ç”¨äº?Log4J 1.3 alpha 中提供的映射诊断上下文类åQˆMDCåQ‰ã€‚您可以使用 Log4J 1.2 中提供的嵌套诊断上下文(NDCåQ‰å®žçŽ°ç›¸åŒçš„åŠŸèƒ½ã€‚æœ‰å…?servlet ˜q‡æ×o器的更多通用信息åQŒè¯·å‚阅 参考资æ–?中的信息ã€? 清单 4. åœ?servlet ˜q‡æ×o器中使用诊断上下æ–? import javax.servlet.Filter; ... import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.log4j.MDC; public class LoggerFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Retrieves the session object from the current request. HttpSession session = ((HttpServletRequest)request).getSession(); // Put the username into the diagnostic context. // Use %X{username} in the layout pattern to include this information. MDC.put("username", session.getAttribute("username")); // Continue processing the rest of the filter chain. chain.doFilter(request, response); // Remove the username from the diagnostic context. MDC.remove("username"); } ... } 使用 AspectJ 跟踪执行情况 在对问题˜q›è¡Œè¯Šæ–­æ—Óž¼Œé€šå¸¸è·Ÿè¸ª½E‹åºçš„æ‰§è¡Œæƒ…况会很有帮助。您可以在程序执行的不同地方持箋发送日志消息吗åQŸä¾‹å¦‚方法的入口函数和出口函数。这是一个老问题,在出çŽ?AspectJ 之前一直都没有什么好的解å†Ïx–¹æ¡ˆã€‚ä‹Éç”?AspectJåQŒå¯ä»¥åœ¨åº”用½E‹åºçš„不同地æ–ÒŽ‰§è¡Œä»£ç æ®µã€‚在 AspectJ 中,˜q™äº›åœ°æ–¹éƒ½ç§°ä¸?point cutåQŒåœ¨ point cut 处所执行的代码称ä¸?advice。point cut å’Œadvice 合称 aspectã€? 关于 AspectJåQŒæœ‰ä¸€ä»¶äº‹æƒ…非常神奇,aspect 不用很多努力ž®±å¯ä»¥åº”用到整个应用½E‹åºä¸­ã€‚有å…?AspectJ 的更多信息,请参é˜?参考资料。清å?5 ¾l™å‡ºäº†ä¸€ä¸?AspectJ 源文件的例子åQŒå®ƒç”¨æ¥å¯ÒŽ–¹æ³•的入口和出口函数记录日志。在˜q™ä¸ªä¾‹å­ä¸­ï¼Œè·Ÿè¸ªæ—¥å¿—½E‹åºž®†åœ¨æ¯æ¬¡˜q›å…¥æˆ–退å‡?com.ambrosesoft 包的一个共有方法时都会记录一条日志ã€? 清单 5. 使用 AspectJ 记录æ–ÒŽ³•的入口和出口 import org.apache.log4j.Logger; import java.lang.reflect.Field; public aspect AutoTrace { private static final Logger logger = Logger.getLogger(AutoTrace.class); pointcut publicMethods() : execution(public * com.ambrosesoft..*(..)); pointcut loggableCalls() : publicMethods(); /** * Inspect the class and find its logger object. If none is found, use * the one defined here. */ private Logger getLogger(org.aspectj.lang.JoinPoint joinPoint) { try { /* * Try to discover the logger object. * The logger object must be a static field called logger. */ Class declaringType = joinPoint.getSignature().getDeclaringType(); Field loggerField = declaringType.getField("logger"); loggerField.setAccessible(true); return (Logger)loggerField.get(null); } catch(NoSuchFieldException e) { /* * Cannot find a logger object, use the internal one. */ return logger; } catch(Exception e) { throw new RuntimeException(e); } } /** * An aspect to log method entry. */ before() : loggableCalls(){ getLogger(thisJoinPoint).debug("Entering.." + thisJoinPoint.getSignature().toString()); } /** * An aspect to log method exit. */ after() : loggableCalls(){ getLogger(thisJoinPoint).debug("Exiting.." + thisJoinPoint.getSignature().toString()); } } 回页é¦? 产品环境中的日志 一旦应用程序处于äñ”品环境中之后åQŒæ‚¨é€šå¸¸éƒ½éœ€è¦å…³é—­è°ƒè¯•或信息日志消息åQŒä»Žè€Œå¯¹˜qè¡Œæ—¶çš„æ€§èƒ½˜q›è¡Œä¼˜åŒ–。然而,当有些不好的事情发生æ—Óž¼Œæ‚¨åˆä¸èƒ½åœ¨å¼€å‘环境中重现˜q™ä¸ªé—®é¢˜åQŒé‚£ž®±å¯èƒ½éœ€è¦åœ¨äº§å“çŽ¯å¢ƒä¸­æ¿€‹z»è°ƒè¯•消息了。重要的是能够修æ”ÒŽ—¥å¿—的讄¡½®åQŒè€Œä¸ç”¨å…³é—­æœåŠ¡å™¨ã€‚è¯Šæ–­äñ”品的问题即ä‹É不用èŠÞp´¹æ•°å¤©æ¥è¿›è¡Œè¯¦¾l†çš„调研åQŒé€šå¸¸ä¹Ÿéœ€è¦å‡ ä¸ªå°æ—¶çš„æ—‰™—´ã€‚在˜q™æ®µæ—‰™—´ä¹‹å†…åQŒå¼€å‘äh员需要激‹zÀLˆ–关闭应用½E‹åºä¸åŒèŒƒå›´çš„æ—¥å¿—。如果每‹Æ¡ä¿®æ”ÒŽ—¥å¿—的讄¡½®ä¹‹åŽéƒ½éœ€è¦é‡æ–°å¯åЍäñ”品应用程序,那么情况ž®×ƒ¼šå˜å¾—非常不可靠了ã€? òq¸è¿çš„æ˜¯åQŒLog4J 提供了一¿Uç®€å•的机制来解册™¿™ä¸ªé—®é¢˜ã€‚在 Log4J 1.2 中,DOMConfigurator 中的 configureAndWatch() æ–ÒŽ³•会对 Log4J ˜q›è¡Œé…ç½®åQŒåƈ自动监视日志配置文äšg中的变化。这在清å?6 中进行了阐述。(注意åQŒåœ¨ Log4J 1.3åQˆç›®å‰ä»æ˜?alpha 版本åQ?ä¸­åÆˆä¸æŽ¨èä‹Éç”?DOMConfiguratoråQŒå®ƒä½¿ç”¨äº†ä¸€ä¸ªæ›´åŠ çµ‹zȝš„实现 JoranConfigurator。) ä¸ÞZº†¼‹®ä¿ configureAndWatch() 是在 Log4J 初始化之前调用的åQŒæ‚¨åº”该在启动类中调用它。不同的应用½E‹åºæœåŠ¡å™¨é‡‡ç”¨äº†ä¸åŒçš„æœºåˆ¶æ¥æ‰§è¡Œå¯åŠ¨ä»£ç åQˆæ›´å¤šä¿¡æ¯è¯·å‚阅 参考资料)。详¾l†ä¿¡æ¯è¯·æŸ¥çœ‹åº”用服务器的实现。有些应用服务器可能需要您ž®?Log4J 的库攑ֈ°æœåŠ¡å™¨çš„ classpath 中。日志配¾|®æ–‡ä»¶åº”该保存到一个需要日志的人可以访问的位置ã€? 清单 6. 使用 DOMConfigurator 配置 Log4J /* * Configure Log4J library and periodically monitor log4j.xml for any update. */ DOMConfigurator.configureAndWatch("/apps/config/log4j.xml"); 如果您的日志配置文äšg不能方便地进行访问(例如您的产品环境是由一个不同的¾l„织˜q›è¡Œ¾l´æŠ¤çš„)åQŒé‚£ä¹ˆæ‚¨ž®±å¿…™åÖM‹É用一¿Uä¸åŒçš„½{–略。标准的æ–ÒŽ³•是ä‹Éç”?JMXåQŒå®ƒæä¾›äº†ä¸€ä¸ªæ ‡å‡†çš„ API 来管理自å·Þqš„应用½E‹åºè®„¡½®ã€‚在çŽîC»£ JMX 兼容的服务器中,您可以ä‹É用管ç?bean åQˆæˆ– MBeans åQ‰æ¥æ‰©å±•应用服务器的½Ž¡ç†¾lˆç«¯çš„功能(更多有关使用 JMX 以及åœ?WebSphere Application Server 6.0 中ä‹Éç”?JMX 的内容,请参é˜?参考资æ–?一节。)ç”׃ºŽ JMX æ–ÒŽ³•非常复杂åQŒå¦‚果您的情况需要ä‹Éç”?JMXåQŒé‚£ž®±åº”该只用作˜q™ä¸ªç”¨é€”ã€? 记录敏感的数æ? 在记录äñ”品环境中的日志时åQŒé™¤äº†æŠ€æœ¯æ–¹é¢çš„æŒ‘战之外åQŒè¿˜å­˜åœ¨ä¸€äº›ä¸šåŠ¡é—®é¢˜éœ€è¦å…‹æœã€‚ä¾‹å¦‚ï¼Œè®°å½•æ•æ„Ÿçš„ä¿¡æ¯å¯èƒ½ä¼šå¼•è“vå®‰å…¨æ€§çš„é—®é¢˜ã€‚åÆˆæ²¡æœ‰ä»ÖM½•限制可以防止您将某个用户的用户名和密码保存到正文文äšg中。您˜q˜å¿…™å»è¦ä¿æŠ¤å…¶ä»–敏感信息åQŒä¾‹å¦?e-mail 地址、电话号码以及帐号信息。安全顾问和设计师有责ä“Q要确保这些信息不会未加ä“Q何处理就保存到日志中。对敏感信息使用安全性专用的日志½E‹åºå¯ä»¥å¸®åŠ©é™ä½Žé£Žé™©ã€‚æ‚¨å¯ä»¥¾l™è¿™ä¸ªæ—¥å¿—程序配¾|®ä¸€ä¸ªä¸“用的附加器,从而ä‹É用一¿UåŠ å¯†çš„æ ¼å¼æ¥ä¿å­˜æ¶ˆæ¯ï¼Œæˆ–è€…å°†å…¶ä¿å­˜åˆ°ä¸€ä¸ªå®‰å…¨çš„åœ°æ–¹ã€‚ç„¶è€Œï¼Œé˜²æ­¢å‡ºçŽ°å®‰å…¨é£Žé™©çš„æœ€ä½Ïx–¹æ³•是在项目开始之前就讄¡½®é€‚当的编码规范,òq¶åœ¨‹‚€æŸ¥ä»£ç æ—¶å¼ºåˆ¶æ–½è¡Œ˜q™äº›è§„范ã€? ä»Žå¼‚å¸æ€¸­æå–有用信息 当发生一个非预期的异常时 —â€?例如åQŒå¦‚果数据库˜qžæŽ¥½Hç„¶å¤±æ•ˆäº†ï¼Œæˆ–者系¾lŸèµ„源变得很低了 —â€?ž®±å¿…™åÕd¯¹å…‰™€‚当地进行处理,否则ž®×ƒ¼šä¸¢å¤±æœ‰ç”¨çš„信息,˜q™äº›ä¿¡æ¯åœ¨è¯Šæ–­é—®é¢˜æ—¶æ˜¯éžå¸¸æœ‰å¸®åŠ©çš„ã€‚é¦–å…ˆï¼Œå¿…é¡»è®°å½•å¼‚å¸¸åŠå…¶å †æ ˆè·Ÿè¸ªçŠ¶å†µã€‚å…¶‹Æ¡ï¼Œåº”该使用一¿Uç”¨æˆïL•Œé¢å‹å¥½çš„æ–¹å¼æ¥æ ‡è¯†é”™è¯¯é¡µé¢ï¼Œ˜q™å¯¹äºŽç»ˆç«¯ç”¨æˆ·å’ŒæŠ€æœ¯æ”¯æŒå°¾l„来说都是非常有帮助的ã€? 技术支持小¾l„在接到一个技术支持电话时所面äÍ的一个挑战是在用æˆäh‰€æŠ¥å‘Šçš„é—®é¢˜ä¸Žç‰¹å®šçš„æ—¥å¿—å¼‚å¸æ€¹‹é—´å¾ç«‹æŸ¿Uå…³è”。非常有用的一¿Uç®€å•技术是为每个异帔Rƒ½è®°å½•一个唯一çš?ID。这ä¸?ID 可以告诉用户åQŒä¹Ÿå¯ä»¥åŒ…含在终端用æˆäh‰€å¡«å†™çš„问题报告表单中。这样可以减ž®‘技术支持团队成员猜‹¹‹çš„æ—‰™—´åQŒè®©ä»–们可以快速对问题作出响应。考虑到可è¯ÀL€§çš„问题åQŒå¯ä»¥å®šæœŸå¯¹ ID ˜q›è¡Œå›žæ”¶ã€? 日志文äšg的管ç? 一个非常繁忙的应用½E‹åºçš„æ—¥å¿—文件可能会˜q…速变得非常大。较大的日志文äšg很难使用åQŒè¿™æ˜¯å› ä¸ºå®ƒä»¬éœ€è¦è¿‡æ»¤å¤§é‡çš„噪声才能扑ֈ°æœ‰ç”¨çš„信受÷€‚Log 循环 是常见的一个可以帮助解册™¿™ä¸ªé—®é¢˜çš„实践。日志åó@环会周期性地å¯ÒŽ—§æ—¥å¿—˜q›è¡Œå½’æ¡£åQŒè¿™æ äh–°æ¶ˆæ¯ž®±å¯ä»¥æ€»èƒ½å†™åˆ°ä¸€ä¸ªç›¸å¯¹è¾ƒž®çš„æ–‡äšg中。日志消息降低了一些效用来提高速度åQ›æ‚¨å¯èƒ½å¾ˆå°‘需要参考一周之前的日志消息。在 Log4J 1.2 中, DailyRollingFileAppender 附加器可以根据所提供的日期模式来循环使用日志文äšg。(åœ?Log4J 1.3 中,已经对这个åó@环日志文仉™™„加器重新˜q›è¡Œäº†è®¾è®¡ã€‚现在您可以提供一¿Uç­–略来控制如何˜q›è¡Œå¾ªçŽ¯äº†ã€‚ä¾‹å¦‚ï¼Œ TimeBasedRollingPolicy 定义了一¿UåŸºäºŽæ—¶é—´å’Œæ—¥æœŸçš„åó@环模式。)清单 7 昄¡¤ºäº†è®© Log4J 在每天午夜对自己的日志文件进行åó@环所采用的配¾|®ç‰‡æ–­ã€? 清单 7. 使用 DailyRollingFileAppender 循环使用日志文äšg <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="log.txt"/> <param name="Append" value="true"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %p - %m%n"/> </layout> </appender> ... </log4j:configuration> 回页é¦? 集群环境中的日志 现在有越来越多的企业¾U§åº”用程序是在集¾Ÿ¤çŽ¯å¢ƒæˆ–åˆ†å¸ƒå¼çŽ¯å¢ƒä¸­˜q›è¡Œéƒ¨çÖvçš„ã€‚ç„¶è€Œï¼Œé›†ç¾¤çŽ¯å¢ƒä¸­çš„æ—¥å¿—éœ€è¦æ›´å¤šè§„åˆ’ï¼Œå› äØ“æ¶ˆæ¯éƒ½æ˜¯ä»Žä¸åŒçš„æºå¤´ç”Ÿæˆçš„ï¼ˆé€šå¸¸æ˜¯ä¸åŒçš„æœºå™¨åQ‰ã€‚如果要对不同的机器记录日志åQŒé‚£ž®±å¿…™åÕd¯¹˜q™äº›æœºå™¨çš„æ—¶é—´æˆ³˜q›è¡ŒåŒæ­¥åQŒå¦åˆ™æ—¥å¿—消息的‹Æ¡åºž®±æØœä¹×ƒº†ã€‚对机器间时钟进行同步的一¿Uç®€å•方法是使用一个时间服务器。有两种æ–ÒŽ³•可以讄¡½®æ—‰™—´æœåŠ¡å™¨ã€‚æ‚¨å¯ä»¥æŒ‡å®šä¸€å°å†…éƒ¨çš„æœºå™¨ä½œäØ“æ—‰™—´æœåŠ¡å™¨ã€‚ç„¶åŽå…¶ä»–æœºå™¨å°±å¯ä»¥ä½¿ç”¨¾|‘络旉™—´åè®®åQˆNTPåQ‰æ¥ä¸Žæ—¶é—´æœåŠ¡å™¨çš„æ—¶é—´æˆ³˜q›è¡ŒåŒæ­¥ã€‚另外,您可以ä‹Éç”?Internet 上提供的旉™—´æœåŠ¡å™¨ï¼ˆè¯·å‚é˜?参考资料)。在 AIX 上,xntpd 守护˜q›ç¨‹ç”¨æ¥å¯¹ä¸åŒæœºå™¨çš„¾pȝ»Ÿæ—‰™—´˜q›è¡ŒåŒæ­¥ã€‚当机器å…ähœ‰ç›¸åŒçš„æ—¶é—´ä¹‹åŽï¼Œž®±å¯ä»¥å¯¹æ—¥å¿—一赯‚¿›è¡Œåˆ†æžäº†ã€? 在集¾Ÿ¤çŽ¯å¢ƒä¸­æœé›†æ—¥å¿—æ¶ˆæ¯˜q˜é¢ä¸´ç€ä¸€äº›æŒ‘战。在˜q™ç§çŽ¯å¢ƒä¸­ä¿å­˜æ—¥å¿—æ¶ˆæ¯çš„ä¸€¿Uç®€å•方法是ž®†å®ƒä»¬ä¿å­˜åˆ°ä¸ÀLœºç‰¹å®šçš„æ—¥å¿—文件中。当集群是ä‹Éç”?session affinity 配置æ—Óž¼Œ˜q™å¯ä»¥å¾ˆå¥½åœ°å·¥ä½œ —â€?如果å¯ÒŽŸä¸ªç‰¹å®šç”¨æˆ·ä¼šè¯çš„è¯äh±‚都要到同一个服务器上,òq¶ä¸” EJB 也都是部¾|²åœ¨æœ¬åœ°çš„。在˜q™ç§é…ç½®ä¸­ï¼Œé›†ç¾¤ä¸­çš„æœºå™¨æ‰€äº§ç”Ÿçš„æ—¥å¿—文仉™ƒ½å¯ä»¥ç‹¬ç«‹˜q›è¡Œåˆ†æžã€‚如果不是这¿Uæƒ…å†?—â€?换而言之,如果ä»ÖM½•¾l™å®šçš„请求都可以由多台机器进行处ç?—â€?那么对不同日志文件中的日志消息进行分析就会变得更加困难。在˜q™ç§æƒ…况中,一¿Uå¥½çš„办法是使用¾pȝ»Ÿ½Ž¡ç†è½¯äšg来管理日志消息,例如 IBM Tivoli] 软äšgåQˆè¯·å‚阅 参考资æ–?中的链接åQ‰ã€‚è¿™¿UèÊY件对所有的日志消息åQˆåœ¨¾pȝ»Ÿ½Ž¡ç†è½¯äšg的术语中¿UîC¹‹ä¸?事äšgåQ‰æä¾›äº†ä¸€ä¸ªç»¼åˆçš„视图åQŒä»Žè€Œä¾¿äºŽç®¡ç†å‘˜ä½¿ç”¨ã€‚ç³»¾lŸç®¡ç†èÊY件也可以æ ÒŽ®æ‰€æŽ¥æ”¶åˆ°çš„事äšg的类型触发一些操作(例如发é€?e-mail 消息或传呼消息)ã€? 回页é¦? ¾l“束è¯? 在本文中åQŒæˆ‘们介¾läº†åœ¨è§„划日志策略时需要考虑哪些问题。正如在¾~–程时所¼„°åˆ°çš„é—®é¢˜ä¸€æ øP¼Œä»Žä¸€å¼€å§‹å°±é‡‡ç”¨ä¸€ä¸ªç»˜q‡è¯¦¾l†è€ƒè™‘的规划要比在˜q›è¡Œçš„同时规划更能节省工作量。良好的日志½{–略可以极大地帮助对问题˜q›è¡Œè¯Šæ–­ã€‚最¾lˆï¼Œ¾lˆç«¯ç”¨æˆ·å¯ä»¥èŽ·å¾—æ›´å¥½çš„åº”ç”¨ç¨‹åºï¼Œòq¶èƒ½ä»ŽæŠ€æœ¯æ”¯æŒå›¢é˜ŸèŽ·å¾—è¿…é€Ÿçš„å“åº”ã€? 回页é¦? 参考资æ–? * 您可以参阅本文在 developerWorks 全球站点上的 英文原文ã€? * Apache Log4J 库是 Java òq›_°ä¸Šç‰¹æ€§æœ€ä¸°å¯Œã€æœ€æˆç†Ÿçš„æ—¥å¿?APIã€? * 官方çš?short introduction to Log4J æ˜¯äØ“é‚£äº›å¸Œæœ›ä½¿ç”¨ Log4J 库的人准备的一个必è¯È‰©ã€? * Log4J 教程 å¯ÒŽ—¥å¿—包˜q›è¡Œäº†å¾ˆå¥½çš„介绍ã€? * Java Logging API æ˜?Java 1.4 及其更高版本中所提供的一个标准日å¿?API。这ä¸?API 最初是 JSR 47ã€? * Brian Gilstrap 撰写的“An introduction to the Java Logging API”(OnJava.comåQ?002 òq?6 月)讨论了这个标准日å¿?API çš„ä‹É用问题ã€? * Stuart Dabbs Halloway 撰写的“The Java Logging API”(JavaProåQ?002 òq?6 月)也很好地介绍了这ä¸?APIã€? * Apache Commons Logging API 对其他实现提供了一¿Uå°è£…,从而让您可以在不同的实çŽîC¹‹é—´è¿›è¡Œåˆ‡æ¢ã€? * 嵌套诊断上下文(NDCåQ?ž®†ä¸Šä¸‹æ–‡ä¿¡æ¯ä¿å­˜åœ¨æœ¬åœ°çº¿½E‹å­˜å‚¨ä¸­åQŒåœ¨äº§ç”Ÿæ—¥å¿—消息时可以ä‹É用这些信息ã€? * XStream 库可以ä‹Éç”?introspection ž®?Java 对象转化æˆ?XML åQˆåä¹‹äº¦å¯ï¼‰ã€‚它对于记录应用½E‹åºçš„状态来说非常有用ã€? * Servlet filter 可以截获è¯äh±‚和响应,òq¶èƒ½ç”¨äºŽä¸ºæ—¥å¿—消息设¾|®ä¸Šä¸‹æ–‡æ¶ˆæ¯ã€? * Sun çš?The Essentials of Filters 是学ä¹?servlet ˜q‡æ×o器的一个很好资源ã€? * 受欢˜qŽçš„ developerWorks 作è€?Sing Li 在“Tomcat 的过滤诀½Hâ€ï¼ˆdeveloperWorksåQ?001 òq?6 月)一文中åQŒä»‹¾läº†æœ‰å…³ servlet ˜q‡æ×o的两炚w—®é¢˜ï¼Œ˜q™ç¯‡æ–‡ç« ž®†å‘您展½Cºå¦‚何在应用½E‹åºä¸­å……分利用这些过滤器ã€? * AOP@Work ¾pÕdˆ—åQŒç”±é¢å‘æ–šw¢å¼€å‘社区的领先专家执笔撰写åQŒæ·±å…¥ä»‹¾läº†åº”用 AOP 的问题。相å…Ïx–‡ç« æœ‰â€œä»‹¾l?AspectJ 5”和“用新的 AJDT 本本½Ž€åŒ?AOP 开发”ã€? * Wayne Beaton å’?Sree Anand Ratnasingh 撰写的“Migrating WebLogic startup code to WebSphere Application Server V5”(developerWorks, 2004 òq?1 月)åQŒè®¨è®ÞZº†ä¸¤ä¸ª‹¹è¡Œçš„应用服务器启动代码的差异ã€? * 查看 Java Management ExtensionsåQˆJMXåQ‰ä¸»™åüc€? * 受欢˜qŽçš„作è€?Sing Li 在他çš?3 ½‹‡ç³»åˆ—文章“从黑箱åˆîC¼ä¸šï¼Œ½W?1 部分: ½Ž¡ç†åQŒJMX 1.1 样式 â€?中对 JMX ˜q›è¡Œäº†æ·±å…¥çš„介绍ã€? * ˜q™ä¸ª 帮助™åµé¢ 讨论了ä‹Éç”?Java Management ExtensionsåQˆJMXåQ‰æ‰©å…?WebSphere Application Server ½Ž¡ç†¾pȝ»Ÿçš„内宏V€? * Network Time Protocol ™å¹ç›®ä¸»é¡µä¸Šç½—列了很多公共旉™—´æœåŠ¡å™¨ï¼Œæ‚¨å¯ä»¥ä‹É用它们来å¯ÒŽœºå™¨æ—¶é’Ÿè¿›è¡ŒåŒæ­¥ã€? * xntpd 手册™å?讨论äº?AIX 上的¾|‘络旉™—´åè®®å®ˆæŠ¤˜q›ç¨‹çš„内宏V€? * 您可以在 developerWorks çš?Java 技术专åŒ?中找到有å…?Java ¾~–程各方面知识的文章ã€? 回页é¦? 关于作è€? Charles Chan 是一名独立èÊY仉™¡¾é—®ï¼Œåœ¨åŠ æ‹¿å¤§çš?Toronto 工作。他的兴­‘£åŒ…括分布式¾pȝ»Ÿã€é«˜æ€§èƒ½è®¡ç®—、国际化以及软äšg设计模式。在½Iºé—²æ—‰™—´åQŒä»–ä¸ºå¼€æºç¤¾åŒø™µA献自å·Þqš„æˆæžœã€?img src ="http://www.aygfsteel.com/jackybu/aggbug/19545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jackybu/" target="_blank">è¾?/a> 2005-11-13 08:12 <a href="http://www.aygfsteel.com/jackybu/articles/19545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">Õò°²ÏØ</a>| <a href="http://" target="_blank">ºº´¨ÊÐ</a>| <a href="http://" target="_blank">°¢ÀÕÌ©ÊÐ</a>| <a href="http://" target="_blank">Îä°²ÊÐ</a>| <a href="http://" target="_blank">½ðºþÏØ</a>| <a href="http://" target="_blank">ÎÚÀ¼ÏØ</a>| <a href="http://" target="_blank">Âí°°É½ÊÐ</a>| <a href="http://" target="_blank">¹ãÎ÷</a>| <a href="http://" target="_blank">Õò½­ÊÐ</a>| <a href="http://" target="_blank">ãä½­ÊÐ</a>| <a href="http://" target="_blank">¶ÁÊé</a>| <a href="http://" target="_blank">ÁÙ·ÚÊÐ</a>| <a href="http://" target="_blank">³ç×óÊÐ</a>| <a href="http://" target="_blank">º×ɽÊÐ</a>| <a href="http://" target="_blank">ËçÄþÏØ</a>| <a href="http://" target="_blank">»ªÄþÏØ</a>| <a href="http://" target="_blank">ͨµÀ</a>| <a href="http://" target="_blank">ÇØ°²ÏØ</a>| <a href="http://" target="_blank">Æ¤É½ÏØ</a>| <a href="http://" target="_blank">¹ÝÌÕÏØ</a>| <a href="http://" target="_blank">ãë´¨ÏØ</a>| <a href="http://" target="_blank">¶´¿ÚÏØ</a>| <a href="http://" target="_blank">ÄÏÑôÊÐ</a>| <a href="http://" target="_blank">ºÍÁÖ¸ñ¶ûÏØ</a>| <a href="http://" target="_blank">Ê©µéÏØ</a>| <a href="http://" target="_blank">ÂíÉ½ÏØ</a>| <a href="http://" target="_blank">Æß̨ºÓÊÐ</a>| <a href="http://" target="_blank">Ã×ȪÊÐ</a>| <a href="http://" target="_blank">½øÏÍÏØ</a>| <a href="http://" target="_blank">Âí¹«ÊÐ</a>| <a href="http://" target="_blank">Á鱦ÊÐ</a>| <a href="http://" target="_blank">ºÚË®ÏØ</a>| <a href="http://" target="_blank">¾®¸ÔɽÊÐ</a>| <a href="http://" target="_blank">Í©³ÇÊÐ</a>| <a href="http://" target="_blank">¾£ÖÝÊÐ</a>| <a href="http://" target="_blank">ÖÙ°ÍÏØ</a>| <a href="http://" target="_blank">¹óÄÏÏØ</a>| <a href="http://" target="_blank">É̶¼ÏØ</a>| <a href="http://" target="_blank">ÇàÆÖÇø</a>| <a href="http://" target="_blank">³¯ÑôÏØ</a>| <a href="http://" target="_blank">ÄþÎäÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>