合併大型 IIS 日誌
我計劃使用 Webalizer 來分析和繪製我們的 IIS 日誌,但是因為我們有一個伺服器場,Webalizer 要求我確保所有日誌都按時間順序排列(否則它會開始跳過結果)。
我們的日誌以 gzip 格式儲存,因此我首先將所有內容解壓縮到單獨的文件中,然後我使用 LogParser 2.2 來合併這些文件。我的 LogParser 命令是:
LogParser.exe -i:iisw3c "select * into combinedLogFile.log from *.log order by date, time" -o:w3c
我可能不需要 * 但我確實需要大部分欄位,因為 Webalizer 將需要它們。這在我的一些日誌上工作得非常好,但是我們的一個伺服器場集群會生成大量日誌,我們有 14 台伺服器,其中每台伺服器的日誌(至少)每天 2.5 GB(每個日誌都在單獨的一天)。因此,當我嘗試合併這些日誌時,LogParser 只會因無意義的通用錯誤而崩潰。
我認為這是一個記憶體問題,所以我嘗試了多種方法來嘗試最小化記憶體。
我正在使用 powershell 呼叫 LogParser,因此我開始嘗試使用標準 Powershell 管道對輸入進行管道傳輸。(這導致 Powershell(而不是 LogParser)中的 OutOfMemoryException 比僅以我可以做到的任何方式使用文件更快)。
我最終得到的是使用多個命名管道,這些管道從批處理文件呼叫中呼叫到“Cat”,直接將其管道傳輸到 LogParser 中……然後我回到了我在預壓縮它們時開始的地方。
我們還有其他腳本可以處理這些相同的日誌文件,並且它們都沒有問題(儘管它們的輸出通常比這個小)。
因此,我只想知道您是否對合併所有這些文件或某些 LogParser 腳本的更好方法有任何想法,因為我想出的那個還不夠。
PS 我知道我可能會在 .NET 中編寫一個合併程序,因為所有單獨的日誌都已經排序,所以我一次不需要讀取超過幾行,但我試圖避免這樣做,如果可能的。
鑑於您在嘗試對一天的數據進行排序時遇到問題,我會考慮兩種策略之一。
- 找到更好的排序。看看您是否可以讓 Windows 排序工具為您工作。日誌首先使用日期和時間進行操縱,出於某種原因,採用 ascii-text-sort 友好格式。它使用更少的記憶體,並且不必解析行來排序。我敢打賭這對你有用。
- 編寫一個交錯文件,打開所有 14 個文件並從每個文件的頂部拉出最早的一行,同時遍歷 14 個文件。想到這一點我不寒而栗,但每個文件只需要 64KB 的記憶體。
舊答案:
分而治之。編寫一個腳本,讀取日誌並按日期將它們放入新文件中,其中包含包含日期的已知文件名 (weblog-20110101.log)。對按時間排序的每個文件執行排序。將您需要的文件放在一起。