2010-07-25 63 views
2

我有一個虛擬主機託管多個虛擬主機。每個主機都有自己的access.log和error.log。目前,沒有日誌輪轉設置,但這可能會改變。需要關於如何編碼我的日誌解析器的一些想法

基本上,我想解析這些日誌來監視帶寬並收集統計信息。

我的想法是寫一個解析器並將信息保存到一個小的sqlite數據庫。該腳本將每5分鐘運行一次,並使用Python的seektell方法從最後解析的位置打開日誌文件。這使我無法每隔5分鐘解析一個10GB的日誌文件,當我需要的是坐在它的最後的新信息時(沒有記錄旋轉,請記住?)。

經過一番思考,我意識到,我做的是從日誌文件中取信息,並把它們放入一個數據庫......從一個位置移動到另一個數據:/

所以怎麼回事我可以這樣做嗎? 我希望能夠做一些事情,如:

python logparse.py --show=bandwidth --between-dates=25,05|30,05 --vhost=test.com 

這將打開test.com的日誌文件,並告訴我用於指定的5天的帶寬。

現在,我的問題是,當我只想要5天的數據時,我該如何防止自己解析10GB的數據?

如果我想用我的想法將日誌數據每5分鐘保存到一個數據庫中,我可以保存日期的unix時間戳並在它們之間提取數據。簡單。但我寧願直接解析日誌文件。

回答

0

保存的最後一個位置

當你有一個日誌文件的解析完成後,保存在數據庫中引用兩個完整的文件路徑和位置的表中的位置。 5分鐘後運行解析器時,您將查詢數據庫以查找要解析的日誌,檢索位置並從此處開始。

保存數據

當你登錄旋轉,添加數據庫中的其它附加鍵將包含日誌文件的第一行的第一線。所以當你從一個文件開始時,首先閱讀第一行。當你查詢數據庫時,你必須檢查第一行而不是文件名。

第一行應始終是唯一的,因爲您有時間戳。但請不要忘記,符合W3C標準的日誌文件通常在文件的開頭寫入標題。所以第一行應該是第一行數據。

保存數據,你只需要

當解析W3C,這是非常容易閱讀發送的字節數。如果只保留這些信息,解析速度將非常快。通過更新數據庫中現有的行,或者添加一個帶有時間戳的新行,將其存儲在數據庫中,以便在查詢中稍後與其他人聚合。

不要重新發明輪子

除非你正在做的是非常具體的,我推薦你搶在網絡上的開源解析器。 http://awstats.sourceforge.net/

2

除非您爲每一天創建不同的日誌文件,否則除了根據請求解析整個日誌以外,沒有其他辦法。

我仍然會使用數據庫來保存日誌數據,但是使用您想要的時間單位分辨率(例如,以一天/小時的間隔保持帶寬)。使用數據庫的另一個優點是,您可以非常容易地進行範圍查詢,例如您在示例中給出的範圍查詢,並且可以快速地進行。無論何時您不再需要舊數據,都可以將其從數據庫中刪除以節省空間。

此外,您不需要每次都解析整個文件。每當寫入一行時,您都可以在pyinotify的幫助下監視對文件的寫入操作,您可以更新數據庫中的計數器。或者,您可以在每次讀取文件時將最後一個位置存儲在文件中,並在下次讀取該位置。當文件被截斷時要小心。

概括起來:

  • 在一天分辨率保持在數據庫中的數據(例如,每一天的帶寬)
  • 使用pyinotify監視寫入日誌文件,這樣你不「T在讀取整個文件並通過再次

如果您不想編寫自己的解決方案,看看WebalizerAWStatsthis list選擇一個工具。

編輯:

WebLog Expert也看起來很有希望。看看其中一個reports

1

從大型日誌文件中提取所需的5天數據歸結爲找到正確的起始偏移量,以便在開始解析之前查找()該文件。

你可以使用通過文件二進制搜索,每次發現的位置是:seek()os.stat(filename).st_size/2,調用readline()一次(丟棄結果)跳到當前行的結尾,然後做兩個readline()秒。如果第一行是在你想要的開始時間之前,第二行是在它之後,那麼你的起始偏移量是tell() - len(second_line)。否則,請執行標準binary search algorithm。 (我忽略了你要找的那一行是第一個或最後一個或不在文件中的角落案例,但這些都很容易添加)

一旦你有了你的起點抵消,從那裏解析行,直到你到達一個比你感興趣的範圍更新的行。

這比每次解析整個日誌文件要快得多,但是如果你要做很多事情在這些查詢中,那麼數據庫可能是值得的額外的複雜性。如果數據庫的大小是一個問題,您可以採用混合方法,其中數據庫是日誌文件的索引。例如,您可以將每天開始的字節偏移量存儲在數據庫中。如果您不想每5分鐘更新一次數據庫,則每次運行時都可以用新數據更新該數據庫logparse.py

儘管如此,正如Pierre和the_void所說的那樣,確保你不會重複發明輪子 - 你不是第一個需要帶寬統計的人:-)