2010-11-22 37 views
0

需要逐步讀取和處理日誌文件。任何建議/想法在Java中做到這一點?在Java中逐步讀取日誌文件

需要考慮所有可能出現的情況,如文件側翻,不同的日誌記錄格式等

感謝, Sudhanshu

+0

」逐步讀取並處理日誌文件。「 - 請添加更多詳細信息。 – darioo 2010-11-22 10:37:02

+0

假設有一個應用程序正在生成日誌(以文件形式),那麼我想編寫一個代碼(使用Java),它將根據需要生成並處理這些最新日誌。第一次讀取日誌不是問題,但我們如何跟蹤最後一條記錄/行讀取?另外,如果由於大小或其他配置的參數而導致文件翻轉,該怎麼辦? – 2010-11-22 11:08:54

+0

當我遇到這個問題時,我在這裏找到了答案:http://www.informit.com/guides/content.aspx?g=java&seqNum=226 – Dan 2011-02-14 12:07:33

回答

2

雖然它很晚但想到編寫我用來實現此功能的方法。

比方說,我們開始一項工作,每5分鐘後定期讀取一個文件。

  1. 在第一次運行時,將整個文件讀
  2. 商店的線數和文件

的最後修改時間進行後續作業運行就變得有意思了。

  1. 在下次作業運行期間,檢查文件是否被修改(使用文件上次修改時間和在早期作業運行期間存儲的文件)。如果該文件未被修改,則不執行任何操作。
  2. 如果文件被修改,我們只需要閱讀新的行。我們從早期的工作中獲得行數,所以用它來確定要跳過的行數。

到目前爲止很好,如果文件翻轉過來呢?

  1. 假設我們有一個文件時,文件被輾過命名模式...
  2. 通過獲取所有文件匹配模式,並根據最後修改時間的文件以升序進行排序
  3. 迭代文件,並從最後一次修改時間大於上次作業運行時間的那一個開始。使用存儲線數巧妙地跳過已讀線
  4. 復位線數,當你用一個新的文件啓動之後

這就是它!

對於一些奇怪的場景,您可能需要在幾個地方放置IF條件。其中一種情況是,當您迭代文件時,如果文件的上次修改時間與存儲的文件完全相同,則只需重置行數 - 以便從下一個/新文件的第一行開始。對於後續作業

示例代碼運行:

的(文件文件:文件){
如果(file.lastModified()> storedLastModifiedTime){
//你要處理的文件,照顧線計
}否則如果(file.lastModified()== storedLastModifiedTime){
//重置存儲行計數
}
}

任何建議/意見/問題? 「

3

你可以看看Chainsaw

+0

+1:你的第一段不太相關;這個問題是關於閱讀日誌,而不是寫作。然而,電鋸看起來完全適合。 – 2010-11-22 12:05:34

+0

我猜Chainsaw只適用於log4j,那麼其他日誌API呢? – 2010-11-23 02:44:48

+0

不知道任何其他人對不起(至少不是免費的開源軟件) – 2010-11-23 09:45:12

0

我試圖接近漂亮很多相同的問題。它看起來並不像看起來那麼瑣碎。您必須忽略EOF/EOS的概念,並且必須跟蹤日誌文件中的位置。

我認爲最好的方法是有一個單獨的線程來讀取日誌文件。我用BufferedReader做了一個很有前途的測試。該線程讀取文件末尾的所有數據(其中readLine()返回null),並進入睡眠N秒(在我的情況下爲5秒)。然後醒來後再次嘗試閱讀一行。如果它返回String,則繼續處理。如果它得到null它會再次入睡。它在每次成功讀取時增加行計數器,並在停止/啓動時寫入/讀取它,因此它可以找到日誌文件中的最後位置並從該點開始。

這種方法的唯一問題是N秒等待。有一種方法可以告訴Java「在readLine()上阻塞,而不管EOF/EOS」。隨着第二次等待,您可能正在睡覺,而數據已經可用。然而,睡眠似乎是必要的,除非你想吃掉所有的CPU能力。

+0

我以爲提問者是在現有代碼/ lib之後進行此操作,而不是從頭開始編寫代碼。 – 2010-11-22 12:06:32

+0

醒來後,如果嘗試讀取另一行,您還應該檢查日誌是否翻轉。 – hidralisk 2010-11-22 16:54:21

+0

處理翻轉日誌是具有挑戰性的部分。我們如何確定線程閒置時生成的日誌文件的數量? – 2010-11-23 08:17:06