我想要一個由多個管理數據任務產生的診斷日誌。這些任務可能在多個線程中。每個任務都需要將一個元素(可能包含子元素)寫入日誌;快速出入。如果這是一項單一任務的情況,我會使用XMLStreamWriter,因爲它似乎是簡單/功能的最佳搭配,無需在內存中保留膨脹的XML文檔。從多個線程進行Java日誌記錄的最佳實踐?
但這不是一個單一任務的情況,我不確定如何最好地確保這是「線程安全」,其中應用程序中的「線程安全」意味着每個日誌元素應該正確寫入日誌並且串行(一個接一個,不以任何方式交錯)。
有什麼建議嗎?我有一種模糊的直覺認爲,要走的路是使用一個日誌元素隊列(每個元素都能夠快速生成:我的應用程序忙於做對性能敏感的實際工作),並且有一個單獨的線程來處理日誌元素並將它們發送到一個文件,這樣記錄不會中斷生產者。
日誌記錄不一定是XML,但我希望它是結構化和機器可讀的。
編輯:我把「threadsafe」放在引號中。 Log4j似乎是明顯的選擇(對我來說是新的,但對社區來說很老),爲什麼要重新發明輪子...
我有同樣的問題,但不需要實時顯示日誌(只有在所有線程執行後)。我的解決方案是在每封郵件的開始處添加一個系統時間,並按時分類。 – Fuhrmanator 2013-04-13 21:56:15
系統時間畢竟不可靠 - 有些操作非常接近,以至於它們具有相同的時間戳(以毫秒爲單位)。排序會導致訂單更改。所以,我嘗試的另一件事是使用Colllections.synchronizedList()來包裝消息字符串的ArrayList。添加到字符串的時間戳顯示,即使這樣做並不完美。在我的情況下,一些消息出現故障(一兩毫秒),但這可能是由於對同步列表的add()調用的排隊延遲。 – Fuhrmanator 2013-04-13 22:44:30