2012-02-22 60 views
0

我的java應用程序應該讀取Debian服務器上的Snort應用程序的日誌數據。 Snort應用程序獨立於我的評估應用程序運行,並將其日誌寫入文件。 我的評估應用程序應該每5分鐘檢查一次新內容。這就是爲什麼我會移動日誌文件,以便Snort應用程序必須創建一個新文件,而我的應用程序可以檢查舊數據的已寫入數據。編寫一致的Java移動文件

現在的問題:如何確保我不會銷燬該文件,並在Snort應用程序正在寫入時移動它? Java是否具有檢查文件當前操作的功能,以避免數據丟失?操作系統在寫入時鎖定文件?

感謝您的幫助,Kn0rK3

+0

對我的回答有任何反饋?如果它幫助你,請接受它。 – Gray 2012-03-15 21:37:17

回答

1

不正是你所尋找的,但我會做到這一點在一個非常不同的方式。通過記錄從日誌文件中讀取的最後一個條目的行號/時間戳或RandomAccessFile中的位置(由於顯而易見的原因,第二個選項更高效),並且在下次您讀取文件時,只能從記錄到EOF的位置(在此位置可以再次記錄最後一個讀取位置)。

另外,對於此文件策略,您可以將「每5分鐘一次的池」替換爲「每次獲得update notification時的池」。

由於我認爲你沒有控制「Snort」應用程序的代碼,我不認爲NIO FileLock會幫助你。

+0

的確如此。我無法控制Snort應用程序的代碼。 每次更新時讀取它都不是一個好主意。 Snort應用程序是本地大學網絡的網絡控制應用程序。一分鐘內有很多書面活動是可能的。 – Kn0rK3 2012-02-22 15:46:24

+0

我明白了,所以最好保持一段時間,就像你在做什麼一樣。但對於第一部分,我認爲使用RandomAccessFile進行位置查找的成本可以忽略不計,您可以將該文件作爲只讀文件打開。 – 2012-02-22 15:56:44

1

它不應該是一個問題。通常,日誌記錄應用程序具有某種文件描述符或流可以打開文件。如果文件被重命名,這不會以任何方式影響寫入應用程序 - 名稱與文件內容或其在磁盤上的位置無關。 Snort應該繼續寫入新的文件名,直到它注意到該文件已被重命名,並重新打開一個新的日誌文件到舊名稱並切換到寫入該名稱。

這就是爲什麼它首先重新打開的全部原因。支持這種機制。

現在的問題:我怎樣才能確保我沒有破壞的情況下文件...

你擔心的唯一的事情是,你重命名文件一個不存在的文件名。我建議將它移動到.YYYYMMDD.HHMMSS擴展名或其他東西。

注:在螺紋伐木作業,即使新的文件已被打開,你可能要稍等一下,所有的線程切換到新的日誌流。我不確定Snort是如何工作的,但即使在log文件重新打開後,我也看到log.YYYYMMDD文件正在增長。我只需等待一分鐘,然後再使用重命名的日誌文件。僅供參考。

+0

因此,這意味着我首先移動/重命名文件,等待最後一個條目可以寫入,然後評估數據,而snort應用程序將創建一個帶有舊名稱的新文件並添加新條目。非常感謝你。 – Kn0rK3 2012-02-22 16:29:25

+0

是的,應該有效。你可能會更好:重命名文件,注意由Snort創建的新文件,等待一分鐘,處理舊文件。 – Gray 2012-02-22 16:32:39