多台服務日誌合併問題:把多個日誌中的記錄按時間排序後合併成乙個檔案
典型的多個日誌檔案的時間欄位是這樣的:
log1 log2 log3
00:15:00 00:14:00 00:11:00
00:16:00 00:15:00 00:12:00
00:17:00 00:18:00 00:13:00
00:18:00 00:19:00 00:14:00
14:18:00 11:19:00 10:14:00
15:18:00 17:19:00 11:14:00
23:18:00 23:19:00 23:14:00
日誌合併必須是按時間將多個日誌的交叉合併。合併後的日誌應該是:
00:15:00 來自log1
00:15:00 來自log2
00:16:00 來自log1
00:17:00 來自log3
00:18:00 來自log2
00:19:00 來自log1
....
如何合併多個日誌檔案?
下面以標準的clf格式日誌(apache)為例:
apche的日誌格式是這樣的:
%h %l %u %t /"%r/" %>s %b
具體的例子:
最簡單的想法是將日誌一一讀出來,然後按日誌中的時間字段排序
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優化演算法
統計多台伺服器日誌
q 當某應用部署了多台伺服器時,一次請求可能被路由到其中任意一台做處理,如何通過日誌查詢一次請求的處理結果?a 每台伺服器都去找找總能找到吧。ok,思路是對的,但是人工去操作好麻煩,寫個shell指令碼跑一下。1 建立乙個應用伺服器ip列表檔案prodiplist,如下 10.174.88.199 ...
統計多台伺服器日誌
q 當某應用部署了多台伺服器時,一次請求可能被路由到其中任意一台做處理,如何通過日誌查詢一次請求的處理結果?a 每台伺服器都去找找總能找到吧。ok,思路是對的,但是人工去操作好麻煩,寫個shell指令碼跑一下。1 建立乙個應用伺服器ip列表檔案prodiplist,如下 10.174.88.199 ...
多台伺服器session cookie之間的關係
1 同域跨子域使用一套session和cookie的辦法,ini set session.cookie domain 當前域 可以在php.ini裡修改配置 session.cookie domain 2 同域不同埠 在區域網內使用ip加埠的訪問方式搭了兩個相同程式的站,結果發現使用者在乙個站下登入...