如何合并多個記錄檔?
下面以標準的clf格式日誌(apache)為例:
apche的日誌格式是這樣的:
%h %l %u %t /"%r/" %>s %b
具體的例子:
111.222.111.222 - - [03/Apr/2002:10:30:17 +0800] "GET /index.html HTTP/1.1"
200 419
最簡單的想法是將日誌一一讀出來,然後按日誌中的時間欄位排序
cat log1 log2 log3 |sort -k 4 -t " "
注釋:
-t " ": 日誌欄位分割符號是空格
-k 4: 按第4個欄位排序,也就是:[03/Apr/2002:10:30:17 +0800] 這個欄位
-o log_all: 輸出到log_all這個檔案中
但這樣的效率比較低,要知道。如果一個服務已經需要使用負載平衡,其服務的單機
日誌條數往往都超過了千萬級,大小在幾百M,這樣要同時對多個幾百M的日誌進行排
序,機器的負載可想而之……
其實有一個最佳化的途徑,要知道:即使單個日誌本身已經是一個“已經按照時間排好
序“的檔案了,而sort對於這種檔案的排序合并提供了一個最佳化合并演算法:使用 -m
merge合并選項,
因此:合并這樣格式的3個記錄檔log1 log2 log3並輸出到log_all中比較好方法是
:
sort -m -t " " -k 4 -o log_all log1 log2 log3
注釋:
-m: 使用 merge最佳化演算法
注意:合并後的日誌輸出最好壓縮以後再發給webalizer處理
有的系統能處理2G的檔案,有的不能。有的程式能處理大於2G的檔案,有的不能。盡
量避免大於2G的檔案,除非確認所有參與處理的程式和作業系統都能處理這樣的檔案
。所以輸出後的檔案如果大於2G,最好將日誌gzip後再發給webalizer處理:大於2G的
檔案分析過程中檔案系統出錯的可能性比較大,並且gzip後也能大大降低分析期間的
I/O操作。
日誌的按時間排序合并就是這樣實現的。