ï»??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>