2011-06-19 19 views
0

使用java,我想監視日誌文件,並且如果日誌文件中的任何行與給定的輸入字符串匹配,它應該打印日誌消息。同樣,當啓動這個應用程序時,它應該從日誌文件的末尾讀取,即它應該只讀取更新的日誌消息,如tail -f而不是從日誌文件的開頭。除了使用Apache常見的Tailer API之外,我如何在java中實現這個功能?在java中,是否有任何最簡單的方法來執行tail -f功能,但common.apache.io.Tailer API

+1

如果你完全解釋爲什麼*你不想使用Apache Tailer,你將得到更好的迴應。如果這是因爲需要設置的工作,那麼您可能運氣不好。簡單地模擬'tail -f'功能很容易:你在StdIn上阻塞。但是您可能希望在程序中同時發生其他操作,這意味着使用一個線程並可能是一個'FileChannel'。所有這些至少與使用Tailer一樣複雜,並且沒有大型(ish)用戶社區的好處。 – kdgregory

+0

請參考以下鏈接。 http://www.apacheserver.net/q154517/java-apache-common-tailer-api-reading-old-log-messages – ssbecse

回答

0

創建一個RandomAccessFile來打開該文件,尋找到最後並開始使用readLine()。你得到的第一行可能會在左邊裁剪。如果你想得到最後一行,你可以在閱讀文章之前回顧一下。然後使用Pattern或任何你想測試每一行,所以當它匹配'輸入字符串',你可以打印它。

當你到達EndOfFile的readLine()將拋出EOFException類這樣讀線之前,你可能要考慮當前位置的說明(getFilePointer()),所以你可以再次尋求那裏,然後重試您注意到文件的修改日期之後或文件大小改變。我認爲沒有必要關閉並重新打開文件。要獲取修改日期,您需要一個File。文件長度可以從RAF本身或文件中獲得。

我不確定在EOFException文件結束的情況下,在一行的中間(在結尾沒有\ n)的情況下需要回頭查找。

如果您想要異步行爲,但您不能像使用同步和線程便宜一樣簡單,您可以使用@kdgregory建議的FileChannel。

相關問題