多台伺服器輪訓日誌合併

2021-04-23 02:16:22 字數 1263 閱讀 4869

多台服務日誌合併問題:把多個日誌中的記錄按時間排序後合併成乙個檔案

典型的多個日誌檔案的時間欄位是這樣的:

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加埠的訪問方式搭了兩個相同程式的站,結果發現使用者在乙個站下登入...