2013-03-20 30 views
0

如果我有使用log4j的多個線程寫入到一個日誌文件,我想另一個線程來讀它回來了,有沒有辦法安全地讀取(逐行)這些日誌,這樣我總是讀一個完整的線?如何在另一個線程同時登錄時安全地讀取Log4j日誌?

編輯: 之所以這樣,是我需要的所有日誌上傳到一箇中央位置,它可能是日誌是天或那些剛剛被寫入

+1

根據[log4j](http://logging.apache.org/log4j/1.2/faq.html#a1.7)它是線程安全的 - 是 - 你有什麼具體的問題嗎? – ddmps 2013-03-20 04:51:50

+0

您確定不想滾動這些文件,然後在滾動後再讀取它們嗎?你真的需要實時監控日誌嗎?如果你這樣做,如何編寫自己的appender來記錄它們,然後委託給日誌記錄器,以便在記錄日誌時獲取行。 – Gray 2013-03-20 05:05:18

+0

@Gray:原因是我需要將所有日誌上傳到一箇中央位置,它可能是幾天前的日誌或正在寫入日誌的日誌 – shawn 2013-03-20 06:01:54

回答

0

您應該使用讀寫鎖。

讀鎖可以由多個用戶舉行,如果沒有一個書面的文件,而是一個寫鎖只能由1個線程在同一時間舉行不管是什麼。

只要確保爲你的寫作線程完成寫作,它釋放ReadWriteLock中,讓讀​​線程讀取。同樣,始終釋放讀鎖當讀者讀完這樣的log4j能否續寫

退房

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReadWriteLock.html

然而,來想想看,你有什麼目的,這個?如果您只想監視日誌,則應該使用其他解決方案,而不是在同一個應用程序中使用監視器線程。似乎沒有道理。如果數據在應用程序/服務中可用,爲什麼將它傳遞給一個文件然後再讀取它?

+0

log4j是否使用文件鎖定? – shawn 2013-03-20 06:02:26

+0

我相信log4j確實使用文件鎖定。這就是爲什麼您可以跨多個線程安全地登錄到單個文件。 – 75inchpianist 2013-03-20 15:42:33

+0

很好的答案!你是教授嗎? – 2to1mux 2013-03-21 04:18:01

0

這將是一個痛苦,如果你需要實現自己在做什麼,尤其是你要處理的文件滾動。

針對您的特殊要求,有更好的選擇:

  1. 如果你要的位置要備份可以直接寫入(即安裝在您的文件系統),最好是簡單地設置您的文件將滾動以寫入該備份目錄;或

  2. 利用日誌管理工具,如Splunk來監控和管理您的日誌文件(這樣你甚至不需要複製到備份目錄);或

  3. 即使你需要全部由自己做備份,你並不需要(和沒有理由)做在一個單獨的線程。試圖編寫監視日誌目錄的shell腳本,並利用rsync等工具或自己編寫類似的邏輯,僅對本地和遠程不匹配的文件進行上載。