我打算創建一個程序,該程序可以永久跟蹤大型動態日誌文件集,以便將其條目複製到數據庫中,以便獲得更接近實時的統計信息。日誌文件由不同的守護進程和應用程序編寫,但它們的格式是已知的,因此可以解析它們。有些守護進程每天都會將日誌寫入一個文件,例如Apache的cronolog,它會創建諸如access.20100928之類的文件。這些文件在每個新的一天都會出現,並且可能在第二天被刪除時消失。高效跟蹤多個日誌文件
目標平臺是一個Ubuntu服務器,64位。
什麼是有效閱讀這些日誌文件的最佳方法?
我可以想像PHP這樣的腳本語言,它們自己打開文件並讀取新數據或使用系統工具(如tail -f
)來跟蹤日誌或其他運行時間(如Mono)。 Bash shell腳本可能不太適合解析日誌行並將它們插入數據庫服務器(MySQL),更不用說我的應用程序的簡單配置了。
如果我的程序會讀取日誌文件,我認爲它應該在一秒鐘內對文件進行一次stat()以獲得其大小並在文件生長時打開文件。讀完文件後(希望只返回完整的行),它可以調用tell()獲取當前位置,下次直接找到()到保存的位置繼續讀取。 (這些是C函數的名稱,但實際上我不想在C中這樣做。而Mono/.NET或PHP也提供類似的功能。)
是那個常數stat()打開和關閉一個問題? tail -f
怎麼辦?我可以保持文件打開並通過類似select()的方式通知新數據嗎?或者它總是在文件結尾處返回?
如果我被某種select()或者外部尾巴阻塞,我需要每隔1,2分鐘中斷一次以掃描新的或刪除的文件,這些文件將不再遵循。用尾巴恢復-f然後可能不是很可靠。這應該更好地與我自己保存的文件位置。
我可以使用某種inotify(文件系統通知)嗎?
我相信這個問題帶路:http://stackoverflow.com/questions/324258/is-there-an-equivalent-to-the-net-filesystemwatcher-in-the-linux-world - 它看起來像像一個好的解決方案。 – ygoe 2010-12-23 12:43:45