2012-03-08 56 views
2

java.util.logging.XMLFormatter中有一個名爲getTail()的方法,它寫入物理日誌文件的最後一行。它只是寫XMLFormatter中的getTail()方法如何工作?

</log> 

自己在一條線上。

有人知道如何/何時getTail()被調用?我從來沒有用自己的代碼調用它,它總是寫最後一行。現在,突然間,事實並非如此。我顯然打破了一些東西,但如果我能想到我做了什麼或如何解決這個問題,我就會感到厭煩。我的日誌文件已寫入,但無法打開。伴侶文件似乎是一個鎖,可以確保這一點。 (如果日誌文件名爲Fuzz.log.xml,則另一個文件將被稱爲Fuzz.log.xml.lck,其文件大小爲0.如果刪除該文件,我可以再次編輯我的日誌文件,它缺少最終的日誌標記)。我只是希望日誌記錄代碼爲我再次編寫該標記,以便我可以打開日誌而不刪除鎖定文件並手動添加磁貼。

我可以做些什麼來保持getTail()不起作用?

+0

也許一個不同的問題會幫助我找到問題的根源。什麼進程關閉物理日誌文件?換句話說,當一個日誌文件通常關閉以便我不必刪除鎖定文件並添加標記? – 2012-03-08 22:13:49

回答

0

通常我會期望JDK日誌框架負責流處理。如果查看調用「getTail()」的位置,則會看到它是作爲StreamHandler.flushAndClose()的一部分調用的,這主要是從StreamHandler.close()調用的。

因此,只要記錄功能的流正確關閉,即應用程序正常終止,就會寫入尾部。如果應用程序崩潰或死亡,它可能沒有機會正確關閉文件。

查看這些東西的最佳方法是使用Eclipse並確保JDK源在「Java - > Installed JREs」下的首選項中可用,然後您可以使用所有Eclipse瀏覽功能查看事件連接。

0

如果你願意,你可以強制關閉這樣的:

FileHandler fileHandler = (FileHandler) yourLogger.getHandlers()[0]; 
fileHandler.flush(); 
fileHandler.close(); 

我假設第一個處理程序存在,它是一個文件處理程序。這是你管理這種情況。