<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    空間站

    北極心空

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
    log4j的FAQ


    Frequently Asked Questions about log4j
                                            ---------------------------轉(zhuǎn)載
    譯者聲明:
    1.       這是根據(jù)log4j(jakarta-log4j-1.2.8)的開(kāi)發(fā)包自帶文檔的FAQ翻譯的
    2.       譯者盡力保持原文格式,以便于讀者查找原文
    3.       粉紅色的標(biāo)題代表原文只有標(biāo)題,而沒(méi)有相應(yīng)的內(nèi)容
    4.       對(duì)一些關(guān)鍵詞都帶有原文單詞,便于閱讀
    5.       原文中比較生僻的單詞,譯者都是參考金山詞霸,對(duì)找不到的組合詞都是保持原文。
    6.       對(duì)比較拗口的說(shuō)法,譯者盡量采用意譯的方法,同時(shí)保持原文。
    ·         什么是log4j?
    ·         Log4j是一個(gè)可靠的日志系統(tǒng)嗎?
    ·         什么是log4j的先決條件?
    ·         log4j有javadoc文檔嗎?(Is there javadoc documentation for log4j? )
    ·         有其他的日志包嗎?(What other logging packages are there? )
    ·         有使用log4j的實(shí)例代碼嗎?
    ·         log4j有那些特性呢?
    ·         log4j是線程安全的嗎?
    ·         日志輸出看起來(lái)是什么樣子?
    ·         什么是記錄器?
    ·         怎樣才能改變?nèi)罩具\(yùn)行時(shí)的行為?
    ·         日志記錄(或者不記錄)最快的方法是什么?
    ·         除了把字符串?dāng)?shù)組作為參數(shù)之一輸出,調(diào)試方法還有其他作用嗎?(What is the use of the debug method expecting a String array as one of its parameters?)
    ·         為什么要介紹記錄器(Logger)類,并且我怎樣才能從基于以前實(shí)現(xiàn)(implementation)的字符串移植?(Why was the Logger class introduced and how do I migrate from the previous String based implementation?)
    ·         在記錄器的命名方面,有什么建議嗎?
    ·         我怎樣才能用靜態(tài)模式(in a static block)的方式得到一個(gè)高質(zhì)量(fully-qualified)的類名
    ·         日志輸出可以自定義嗎?
    ·         什么是ForBarAppender的配置選項(xiàng)?
    ·         多客戶端請(qǐng)求的輸出可以對(duì)應(yīng)不同的日志文件嗎?
    ·         記錄器實(shí)例好像僅僅可以被創(chuàng)建,為什么沒(méi)有一個(gè)方法可以移除記錄器實(shí)例?
    ·         按照不同的等級(jí),可以把日志輸出定向到不動(dòng)的輸出源(appender)嗎?
    ·         我怎樣才能對(duì)同一個(gè)文件獲得多個(gè)處理進(jìn)程?
    ·         假如我有許多跨越多個(gè)主機(jī)(可能跨越多個(gè)時(shí)區(qū))的處理進(jìn)程用上述方法記錄日志到相同的文件,時(shí)間戳?xí)l(fā)生什么事情?
    ·         為什么在J2EE或者WAR應(yīng)用程序中l(wèi)og4j不能發(fā)現(xiàn)我的屬性文件?
    ·         假如屬性文件改變,是否有方法讓log4j自動(dòng)加載?
    ·         當(dāng)我使用NTEventLogAppender類時(shí),Windows NT事件觀察器(Windows NT Event Viewer)對(duì)丟失我的事件信息描述行為會(huì)有什么樣的反應(yīng)?
    ·         當(dāng)我使用NTEventLogAppender類時(shí),為什么我不能映射我的記錄器名到顯示在NT事件記錄器(NT Event Log)中的記錄器
    ·         我為什么要把我的log4j擴(kuò)展捐贈(zèng)(donate)給項(xiàng)目呢?
    ·         當(dāng)捐贈(zèng)代碼時(shí),我應(yīng)該緊記什么?
    ·         在哪可以找到最新的log4j發(fā)行版?

    --------------------------------------------------------------------------------

    什么是log4j?
    Log4j是一款幫助程序員輸出日志信息到輸出目的地的工具
    在一個(gè)帶有問(wèn)題的應(yīng)用程序中,使用日志來(lái)定位錯(cuò)誤使很有幫助的。在運(yùn)行情況下,不修改二進(jìn)制應(yīng)用程序使用log4j是可以使日志起作用的。Log4j包被設(shè)計(jì)用來(lái)使日志信息可以用漂碼(shipped code)的形式保存,并且不會(huì)導(dǎo)致高性能開(kāi)銷。它遵循記錄速度(即使沒(méi)有記錄行為)第一的原則
    同時(shí),日志輸出可能是那么的龐大以至于無(wú)法記錄。Log4j中獨(dú)一無(wú)二的特色之一是分級(jí)記錄器(Logger)的概念。使用記錄器,使有選擇的按任意粒度控制輸出日志成為可能。
    Log4j是按兩個(gè)特殊目來(lái)設(shè)計(jì)的:速度和靈活性。在這兩個(gè)必備要求中間,很難找到一個(gè)平衡點(diǎn)。不過(guò),我相信log4j達(dá)到最好的平衡點(diǎn)
    log4j是可靠的日志系統(tǒng)嗎?
    Log4j是不可靠的,它是一個(gè)best-effort和fail-stop的日志系統(tǒng)
    提到fail-stop,我們意思是log4j運(yùn)行在有導(dǎo)致系統(tǒng)崩潰的潛在錯(cuò)誤的運(yùn)行狀態(tài),它不會(huì)拋出意料之外的異常。假如由于某些原因,導(dǎo)致log4j拋出一個(gè)未被捕捉的異常,請(qǐng)發(fā)email到log4j-user@jakarta.apache.org郵件列表
    還有,當(dāng)log4j指定的輸出流(output stream)處于未打開(kāi)、不可寫(xiě)或者已滿的狀態(tài)時(shí),它不會(huì)轉(zhuǎn)向輸出到System.out和System.err。這就避免了由于日志記錄失敗,使用戶的終端充滿錯(cuò)誤信息,因而導(dǎo)致另一個(gè)正在運(yùn)行的程序一團(tuán)槽。然而,log4j將輸出一個(gè)單條信息到System.err表明日志不能正常運(yùn)行。
    log4j的先決條件是什么?
    ·         Log4j是和JDK 1.1.x 兼容的。
    ·         DOMConfigurator是基于the DOM Level 1 API。DOMConfigurator.configure(Element)方法將和任何可以把XML文件解析成DOM書(shū)(DOM tree)的XML解析器很好工作,DOMConfigurator.configure(String filename)方法和它的變量需要一個(gè)和JAXP兼容的XML解析器,例如Xerces(譯注:這也是Apache下面的一個(gè)開(kāi)源項(xiàng)目)或者SUN公司的解析器。編譯DOMConfigurator時(shí)要求JAXP解析器要在classpath環(huán)境變量的路徑下面
    ·         org.apache.log4j.net.SMTPAppender類依賴于JavaMail API。它已經(jīng)和JavaMail API的1.2版本測(cè)試過(guò)了。JavaMail API需要JavaBeans Activation Framework包
    ·         org.apache.log4j.net.JMSAppender類需要JMS API和JNDI的存在
    ·         log4j的測(cè)試代碼(test code)依賴于JUnit測(cè)試框架
    有使用log4j的實(shí)例代碼嗎?
    參見(jiàn)examples/路徑。
    log4j有那些特性?
    ·         Log4j在速度方面已經(jīng)被優(yōu)化過(guò)了
    Log4j是基于記錄器層次命名的(log4j is based on a named logger hierarchy.)
    Log4j是fail-stop但是沒(méi)有依賴性(log4j is fail-stop but not reliable.)
    Log4j是線程安全的
    Log4j是不受預(yù)先確定一套工具限制的
    運(yùn)行時(shí),日志行為可以被放置在一個(gè)配置文件中配置文件可以是屬性文件或者XML格式的
    剛開(kāi)始時(shí),Log4j被設(shè)計(jì)處理java異常(Exceptions)
    Log4j可以定向它的的輸出到一個(gè)文件,控制臺(tái),輸出流(java.io.OutputStream) ,輸出器(java.io. Writer) ,一個(gè)套接字遠(yuǎn)程服務(wù)器(a remote server using TCP),一個(gè)遠(yuǎn)程的UNIX Syslog守護(hù)線程(Unix Syslog daemon),一個(gè)遠(yuǎn)程的JMS的監(jiān)聽(tīng)線程,NT事件的記錄器,甚至發(fā)email。
    Log4j使用了5個(gè)級(jí)別,名稱分別為DEBUG, INFO, WARN, ERROR and FATAL
    日志的輸出格式通過(guò)擴(kuò)張Layout類可以很簡(jiǎn)單的被改變
    日志輸出的目標(biāo)和寫(xiě)策略(the writing strategy)一樣可以工作實(shí)現(xiàn)Appender接口被改變。
    Log4j支持每個(gè)記錄器可以有多個(gè)輸出源(multiple output appenders per logger)
    Log4j支持國(guó)際化。
    log4j是線程安全的嗎?
    對(duì),log4j是線程安全的
    日志輸出看起來(lái)是什么樣子?
    可以用多種方式定制日志輸出。而且,可以通過(guò)實(shí)現(xiàn)一個(gè)自己的布局器(Layout)來(lái)完全覆蓋輸出格式
    這是一個(gè)使用PatternLayout布局器的輸出實(shí)例,這個(gè)布局器帶"%r [%t] %-5p %c{2} %x - %m%n"的轉(zhuǎn)換格式
    176 [main] INFO examples.Sort - Populating an array of 2 elements in reverse order.225 [main] INFO examples.SortAlgo - Entered the sort method.262 [main] DEBUG SortAlgo.OUTER i=1 - Outer loop.276 [main] DEBUG SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0290 [main] DEBUG SortAlgo.OUTER i=0 - Outer loop.304 [main] INFO SortAlgo.DUMP - Dump of interger array:317 [main] INFO SortAlgo.DUMP - Element [0] = 0331 [main] INFO SortAlgo.DUMP - Element [1] = 1343 [main] INFO examples.Sort - The next log statement should be an error message.346 [main] ERROR SortAlgo.DUMP - Tried to dump an uninitialized array.        at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58)        at org.log4j.examples.Sort.main(Sort.java:64)467 [main] INFO examples.Sort - Exiting main method.第一個(gè)字段是從程序開(kāi)始運(yùn)行到該行日志輸出的毫秒數(shù)。第二個(gè)字段是輸出日志的線程。第三個(gè)是日志描述的級(jí)別。第四個(gè)字段是發(fā)出日志請(qǐng)求的記錄器(logger making the log request)的最右面兩個(gè)部分的組成。第五個(gè)字段(恰好在‘-’的前面)是嵌套診斷環(huán)境(nested diagnostic context (NDC)).注意嵌套診斷環(huán)境(NDC)可以是空的,就像剛開(kāi)始的兩個(gè)描述。緊跟在‘-’后面的是描述信息
    什么是記錄器(Loggers)?
    記錄器處于log4j的核心地位。記錄器定義了一個(gè)層次(hierarchy),并且給程序員運(yùn)行時(shí)的控制是否打印控制的描述信息
    記錄器被分配級(jí)別。一個(gè)日志描述的打印依賴于他的級(jí)別和記錄器
    閱讀log4j的使用手冊(cè)(log4j manual)獲取更多信息
    怎樣才能改變?nèi)罩具\(yùn)行時(shí)的行為?
    日志行為可以被設(shè)置在一個(gè)配置文件中,在運(yùn)行時(shí)可以解析這個(gè)文件。使用配置文件,程序員可以定義一個(gè)記錄器并且設(shè)置它的級(jí)別
    PropertyConfigurator類定義了一個(gè)特殊的配置文件的格式。也可以參考examples/Sort.java實(shí)例的配置文件。
    配置文件可以是XML文件。參考log4j.dtd和org.log4j.xml.DOMConfigurator類獲取更多信息
    參考各種為實(shí)現(xiàn)特別配置選項(xiàng)的布局(Layout)和輸出源(Appender)組件。
    包括配置文件,使用者可以使附屬于一套級(jí)別的所有信息無(wú)效,參考下一條。
    日志記錄(或者不記錄)最快的方法是什么?
    例如記錄器l,內(nèi)容如下,
     l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));導(dǎo)致構(gòu)造信息參數(shù)開(kāi)銷的是:轉(zhuǎn)化整型i值和數(shù)組entry[i]為字符串;連接字符串的媒介。不管是否記錄信息都會(huì)發(fā)生這些事情。
    假如你擔(dān)心速度,可以這樣些,
       if(l.isDebugEnabled()) {     l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));   }使用這種方法,假如你在調(diào)試時(shí)不輸出日志,就不會(huì)導(dǎo)致參數(shù)構(gòu)造的開(kāi)銷。另一方面,若記錄器是需要調(diào)試的,無(wú)論記錄器是否可調(diào)試,都將導(dǎo)致檢測(cè)的開(kāi)銷(cost of evaluating),這包括兩個(gè)地方:一個(gè)是debugEnabled,一個(gè)是debug(譯注:就是l.isDebugEnabled()和l.debug(“”)的這兩個(gè)方法的開(kāi)銷)。這是無(wú)關(guān)緊要的日常開(kāi)銷,因?yàn)闄z測(cè)一個(gè)記錄器的花費(fèi)還不到它記錄一個(gè)日志信息的1%時(shí)間。
    在記錄器的命名方面,有什么建議嗎?
    是,有的
    你可以通過(guò)位置(locality)來(lái)命名記錄器(loggers).這證明了用單個(gè)類的類名去實(shí)例化一個(gè)記錄器等同于用完整的記錄器名,這是一個(gè)直截了當(dāng)?shù)囟x記錄器的方法。
    這種方法有如下好處:
    它可以很容易的實(shí)現(xiàn)
    它可以很容易的對(duì)新的開(kāi)發(fā)人員解釋
    它自動(dòng)映射你的應(yīng)用程序的模塊設(shè)計(jì)
    它可以被很隨意的優(yōu)化
    自動(dòng)打印日志記錄器給出的本地日志描述的信息
    然而,這不是日志命名的唯一方法。一個(gè)普通的替代方法是通過(guò)功能區(qū)域來(lái)命名記錄器。例如,“數(shù)據(jù)庫(kù)”(database)記錄器,“遠(yuǎn)程方法調(diào)用”(RMI) 記錄器,“安全”(security) 記錄器,“XML”記錄器。
    你可以在功能和本地子范疇(by functionality and subcategorize by locality)兩者中選擇一個(gè)命名記錄器,就像"DATABASE.com.foo.some.package.someClass"或者"DATABASE.com.foo.some.other.package.someOtherClass"。
    在選擇你自己的記錄器的名稱時(shí),你是完全自由的。Log4j包僅僅允許你按照一個(gè)層次來(lái)管理你的名稱。無(wú)論如何,定義這個(gè)層次是你的責(zé)任
    注意,本地化地命名記錄器往往通過(guò)功能來(lái)命名(Note by naming loggers by locality one tends to name things by functionality),因?yàn)樵诖蠖鄶?shù)的情況下,本地化和功能聯(lián)系更緊密。
    我怎樣才能用靜態(tài)模式(in a static block)的方式得到一個(gè)高質(zhì)量(fully-qualified)的類名?
    你可能很容易按靜態(tài)模式(in a static block,譯注:我沒(méi)有找到最佳譯法,以后再修改吧J)的方式用X.class.getName()方法獲得類X的高質(zhì)量的名稱,。注意,X是類名而不是實(shí)例。X.class不會(huì)創(chuàng)建一個(gè)新的類X的實(shí)例
    這是一個(gè)建議的用例模板:
    package a.b.c; public class Foo { static Logger logger = Logger.getLogger(Foo.class); ... other code }日志輸出可以自定義嗎?
    是的。從0.7.0版本,你就可以擴(kuò)展Layout類來(lái)創(chuàng)建你自己的日志格式。輸出源(Appenders)也通過(guò)你自己選擇的布局器(layout)來(lái)達(dá)到參數(shù)化
    多客戶端請(qǐng)求的輸出可以對(duì)應(yīng)不同的日志文件嗎?
    許多開(kāi)發(fā)者都面臨這樣問(wèn)題,面對(duì)不同的客戶端請(qǐng)求,在相同的類(class)中辨別除日志輸出的類別。他們給log4j的愛(ài)好者提出了一個(gè)獨(dú)具匠心的機(jī)制輸出日志到不同的文件。在大多數(shù)情況下,這不是一個(gè)好的方法。
    使用嵌套診斷環(huán)境(NDC)來(lái)實(shí)現(xiàn)很簡(jiǎn)單的。特別是,當(dāng)處理一個(gè)客戶端請(qǐng)求時(shí),使用NDC.push()將獲得客戶端的特殊信息,例如主機(jī)名、ID或者任何其它區(qū)分信息。從這以后,日志輸出將自動(dòng)包括嵌套診斷環(huán)境,即使日志被輸出到同一個(gè)文件你也能區(qū)分出不同客戶端的請(qǐng)求。
    參考NDC和PatternLayout類獲得更多信息。NumberCruncher例子展示了怎樣用NDC從多個(gè)客戶端區(qū)分出日志輸出信息,即使他們共享同一個(gè)日志文件
    對(duì)應(yīng)用程序,例如虛擬主機(jī)web服務(wù)器(virtual hosting web-servers),NDC的解決方案是行不通的。到log4j的0.9.0版本,log4j開(kāi)始支持多層次樹(shù)(multiple hierarchy trees).因此,依賴當(dāng)前環(huán)境,在相同的記錄器中記錄不同目標(biāo)是可能的。
    什么是ForBarAppender的配置選項(xiàng)?
    Log4j使用JavaBean的方式來(lái)配置。
    因此,在FooBarAppender類中任何一個(gè)賦值方法(setter method)對(duì)應(yīng)一個(gè)配置選項(xiàng)。例如,RollingFileAppender類的setMaxBackupIndex(int maxBackups)方法對(duì)應(yīng)maxBackupIndex選項(xiàng)。選項(xiàng)的第一個(gè)字母可以是大寫(xiě),也就是說(shuō)(i.e.) MaxBackupIndex和maxBackupIndex是相同的,但是MAXBACKUPIndex和mAXBackupIndex是不同的。
    布局器選項(xiàng)也可以通過(guò)賦值方法(setter methods)來(lái)定義。其他的log4j組件大多數(shù)也是這樣做的。
    記錄器實(shí)例好像僅僅可以被創(chuàng)建(譯注:這是與不能刪除對(duì)應(yīng)的,就是說(shuō)為什么記錄器只能創(chuàng)建,不能刪除),為什么沒(méi)有一個(gè)方法可以移除記錄器實(shí)例?
    定義一個(gè)“removed”記錄器不是一件簡(jiǎn)單的事情,該記錄器還要可以被使用者引用。未來(lái)的版本可能會(huì)包含一個(gè)刪除方法(remove method)在Logger類中
    按照不同的等級(jí),可以把日志輸出定向到不同的輸出源(appender)嗎?
    是的,可以這樣。從AppenderSkeleton類擴(kuò)展一個(gè)輸出源(大多數(shù)的log4j輸出源都是擴(kuò)展AppenderSkeleton類),設(shè)置該輸出源的入口選項(xiàng)(Threshold option)來(lái)過(guò)濾所有的日志事件,這些日志事件的入口選項(xiàng)(Threshold option)的值比已經(jīng)設(shè)置的級(jí)別低。
    例如,設(shè)置一個(gè)輸出源的入口選項(xiàng)值為DEBUG,這就允許INFO, WARN, ERROR 和FATAL級(jí)別的信息可以連同DEBUG級(jí)別的信息一起記錄。這是可接受的,因?yàn)闆](méi)有周圍的INFO, WARN, ERROR 和 FATAL的信息,DEBUG信息就沒(méi)有什么作用
    這種規(guī)則通常是使用者想要的最好封裝,因?yàn)檫@是和他(她)心中已有的解決案是相反的(as opposed to her mind-projected solution,譯注:這句話感覺(jué)很拗口,原文意思好像有誤)。
    參考examples/sort4.lcf查找一個(gè)入口(threshold)配置的實(shí)例
    假如你必須使用精確級(jí)別匹配過(guò)濾事件,那么你可以讓任何輸出源都繼承LevelMatchFilter類來(lái)過(guò)濾日志事件。
    我怎樣才能對(duì)同一個(gè)文件獲得多個(gè)處理進(jìn)程?
    你可以讓每個(gè)SocketAppender類都有一個(gè)進(jìn)程日志。接受方的套接字服務(wù)器(SocketServer)(或者簡(jiǎn)單套接字服務(wù)器(SimpleSocketServer))可以接受所有的事件并把它們發(fā)給一個(gè)獨(dú)立的日志文件。
    假如我有許多跨越多個(gè)主機(jī)(可能跨越多個(gè)時(shí)區(qū))的處理進(jìn)程用上述方法記錄日志到相同的文件,時(shí)間戳?xí)l(fā)生什么事情?
    當(dāng)日志事件被創(chuàng)建的時(shí)候,這個(gè)時(shí)間戳也被創(chuàng)建,也就是在debug, info, warn, error or fatal方法被調(diào)用的時(shí)候。這是不受他們(譯注:此處代表日志記錄)到達(dá)遠(yuǎn)程服務(wù)器的時(shí)間影響的。由于時(shí)間戳是以UTC的格式保存在事件中的,所以他們可以顯示在相同的時(shí)區(qū),這個(gè)時(shí)區(qū)是創(chuàng)建這個(gè)日志文件的服務(wù)器所處的時(shí)區(qū)。由于不同機(jī)器的時(shí)鐘是不可以同步的,所以在不同服務(wù)器上產(chǎn)生的事件之間,這會(huì)導(dǎo)致時(shí)間間隔(time interval)的沖突。
    雖然這是一個(gè)有目的的行為,但它最近變的太依賴于版本1.0.4和版本1.1b1之間的bug發(fā)現(xiàn)。1.0.4以前的版本可以在轉(zhuǎn)換器中產(chǎn)生他們自己的時(shí)間戳。在這種情況下,日志文件里的時(shí)間戳?xí)错樞蛉匡@示,這個(gè)時(shí)間戳是當(dāng)他們到達(dá)日志服務(wù)器主機(jī)時(shí),服務(wù)器依賴于本地時(shí)鐘產(chǎn)生的。
    為什么在J2EE或者WAR應(yīng)用程序中l(wèi)og4j不能發(fā)現(xiàn)我的屬性文件?
    簡(jiǎn)單的回答是:log4j的類和屬性文件沒(méi)有被包含在類裝載器(classloader)的范圍內(nèi)。
    詳細(xì)的答案是(并且講解這是怎么回事):J2EE或者Servlet容器利用java的類裝載系統(tǒng)(class loading system)。Sun公司在Java2的版本中改變類裝載的策略,在Java2中類裝載器是按照層次的父子關(guān)系(hierarchial parent-child relationship)來(lái)設(shè)計(jì)。但一個(gè)子類裝載器(譯注:子類裝載器的意思是子-類裝載器,而不是子類-裝載器,這是兩個(gè)不同的概念,注意讀法,這是漢語(yǔ)的語(yǔ)義誤解導(dǎo)致的)需要發(fā)現(xiàn)一個(gè)類或者資源是,它第一步會(huì)把請(qǐng)求委托給父類裝載器(譯注:見(jiàn)子類裝載器的譯注)
    Log4j僅僅使用默認(rèn)的Class.forName()機(jī)制來(lái)裝載類,資源也被按照這樣處理。參考java.lang.ClassLoader的文檔獲得更詳細(xì)信息
    因此,假如你有問(wèn)題,試著自己裝載類和資源。假如你沒(méi)有發(fā)現(xiàn),log4j也不會(huì)發(fā)現(xiàn)。:)
    假如屬性文件改變,是否有方法讓log4j自動(dòng)加載?
    Yes. Both the DOMConfigurator and the PropertyConfigurator support automatic reloading through the configureAndWatch APIs. See the API documentation for more details.
    是的。DOMConfigurator類和PropertyConfigurator類通過(guò)configureAndWatch接口支持自動(dòng)加載。參考API文檔獲得更詳細(xì)信息
    當(dāng)我使用NTEventLogAppender類時(shí),Windows NT事件觀察器(Windows NT Event Viewer)對(duì)丟失我的事件信息描述行為會(huì)有什么樣的反應(yīng)?
    NT事件觀察器依賴于消息資源動(dòng)態(tài)鏈接庫(kù)(message resource DLLs)來(lái)正確顯示事件消息. NTEventLogAppender.dll包含了這些消息資源,但是DLL必須要拷貝到%SYSTEMROOT%\SYSTEM32目錄才可以正確工作
    當(dāng)我使用NTEventLogAppender類時(shí),為什么我不能映射我的記錄器名到顯示在NT事件記錄器(NT Event Log)中的記錄器
    不幸的是,記錄器名是被硬編碼在消息資源DLL中的(參考前面關(guān)于NTEventLogAppender類的問(wèn)題),因此沒(méi)有任何簡(jiǎn)易的辦法覆蓋那些動(dòng)態(tài)的東西… 事實(shí)上,我認(rèn)為這是不可能的,因?yàn)槟悴坏貌粸槊總€(gè)應(yīng)用程序修改DLL資源。無(wú)論如何,以前大多數(shù)的本地應(yīng)用程序都沒(méi)有使用記錄器的專有特性…
    我為什么要把我的log4j擴(kuò)展捐贈(zèng)(donate)給項(xiàng)目呢?
    相對(duì)于GNU的公共許可證(GPL),Apache軟件許可證并沒(méi)有對(duì)你的擴(kuò)展設(shè)置更多的要求。通過(guò)擴(kuò)展,我們得到了完全新的代碼,用這些代碼調(diào)用log4j的類。根據(jù)你的需要,你有權(quán)力來(lái)自由地?cái)U(kuò)展log4j。注意,你不可以把你擴(kuò)展過(guò)的代碼分發(fā)到太廣的人群
    我們非常注重不修改log4j的客戶端代碼,因此log4j的新版本是向后兼容以前版本的。我們是不太關(guān)心log4j內(nèi)部的API(We are a lot less scrupulous with the internal log4j API, 譯注:我沒(méi)有理解這句話的意思,我認(rèn)為這句話有誤,他的原意可能是不注重log4j內(nèi)部相互之間的接口調(diào)用,但對(duì)開(kāi)放的外部接口不是如此)。因此,假如你設(shè)計(jì)你的擴(kuò)展與版本n恰好吻合,然后log4j的版本n+1出來(lái)了,你將很可能需要修改擴(kuò)展的部分來(lái)與新版本相適應(yīng)。因此,你將被迫花費(fèi)寶貴的時(shí)間來(lái)與新版本兼容。這就是經(jīng)常提到的“愚蠢稅收”(stupid-tax)。通過(guò)捐贈(zèng)代碼,并讓其成為標(biāo)準(zhǔn)的一部分,你將節(jié)省不必要的維護(hù)工作。
    假如你的擴(kuò)展是有用的,最終會(huì)有人寫(xiě)一個(gè)擴(kuò)展來(lái)提供相同或者相似的功能。你的開(kāi)發(fā)工作將是浪費(fèi)的。除非你的log4j擴(kuò)展是關(guān)鍵業(yè)務(wù),否則沒(méi)有任何理由不捐贈(zèng)你的代碼項(xiàng)目(譯注:此處的項(xiàng)目是指apache的log4j項(xiàng)目)
    當(dāng)捐獻(xiàn)代碼時(shí),我應(yīng)該緊記(keep in mind)什么?
    1.       給你捐獻(xiàn)的代碼寫(xiě)一個(gè)測(cè)試用例
    沒(méi)有什么比在調(diào)試(也就是日志)代碼時(shí)發(fā)現(xiàn)bug更刺激了。寫(xiě)測(cè)試用例要花費(fèi)一定的時(shí)間,但是對(duì)于一個(gè)被廣泛使用的庫(kù)是至關(guān)重要的,例如log4j。寫(xiě)一個(gè)讓你受追隨者尊敬的測(cè)試用例需要花費(fèi)很大的努力和很長(zhǎng)的時(shí)間。
    2.       堅(jiān)持現(xiàn)有的縮進(jìn)風(fēng)格,即使你討厭這種方法。
    改變現(xiàn)有的縮進(jìn)風(fēng)格會(huì)讓代碼很難理解。讓你自己辛苦,但是別人會(huì)因此而很輕松。Log4j遵循java語(yǔ)言的代碼風(fēng)格(Code Conventions for the JavaTM Programming Language)
    3.       努力讓代碼支持JDK1.1的API
    Log4j的重要的優(yōu)點(diǎn)是它和JDK 1.1.x完全兼容的。
    4.       保持代碼簡(jiǎn)潔,小巧和快速。
    這是和應(yīng)用程序有關(guān)的,而和日志無(wú)關(guān)。
    5.       在相關(guān)的文件中的開(kāi)頭,辨別你自己是否是捐助者。
    6.       對(duì)你代碼要付責(zé)任
    創(chuàng)作軟件和馬拉松賽跑非常相似,它需要時(shí)間和耐力
    7.       我提及要堅(jiān)持縮進(jìn)風(fēng)格了嗎?
    8.       我提及要寫(xiě)測(cè)試用例了嗎?
    在哪可以找到最新的log4j發(fā)行版?
    Log4j的項(xiàng)目被放置在http://jakarta.apache.org/log4j/



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1561604

    posted on 2007-10-09 08:46 蘆葦 閱讀(775) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 四虎最新永久免费视频| 久久亚洲AV无码精品色午夜麻豆 | 免费a在线观看播放| 免费观看黄色的网站| 中国性猛交xxxxx免费看| 男男黄GAY片免费网站WWW| 亚洲va精品中文字幕| 久久亚洲私人国产精品| 国产亚洲美日韩AV中文字幕无码成人 | 国产激情免费视频在线观看 | 亚洲精品无码午夜福利中文字幕| 精品久久洲久久久久护士免费| 四虎在线免费视频| 日韩免费人妻AV无码专区蜜桃| www一区二区www免费| 免费人成大片在线观看播放电影| 亚洲女子高潮不断爆白浆| 亚洲av永久无码精品天堂久久 | 成人毛片100免费观看| 四虎影视永久在线精品免费| 亚洲AV无码成人网站在线观看| 亚洲男人的天堂久久精品| 亚洲午夜精品在线| 亚洲一级毛片免观看| 亚洲午夜电影在线观看| 亚洲av无码国产综合专区 | 好爽…又高潮了毛片免费看| 免费阿v网站在线观看g| 国产成人精品免费午夜app | 亚洲精品综合久久中文字幕| 亚洲国产综合专区电影在线| 亚洲不卡中文字幕无码| 337p日本欧洲亚洲大胆精品555588 | 亚洲精品国产精品国自产网站| 亚洲国产中文在线二区三区免| 亚洲制服丝袜一区二区三区| 亚洲AV成人影视在线观看| 在线a亚洲老鸭窝天堂av高清| 亚洲风情亚Aⅴ在线发布| 小说专区亚洲春色校园| 亚洲一级片免费看|