多伺服器的日誌合并統計(1)

來源:互聯網
上載者:User
伺服器|統計 本文介紹了一種將apache日誌的cronolog輪循和webalizer合并統計的方法。

關鍵詞:你完全不必耐心地看完下面的所有內容,因為結論無非以下2點:

  1 用 cronolog 乾淨,安全地輪循apache"日"志;
  2 用 sort -m 合并排序多個日誌;

  根據個人的使用經曆:

  1) 先介紹apache日誌的合并方法;
  2) 然後根據由此引出的問題說明日誌輪循的必要性和解決方案,介紹如何通過cronolog對apache日誌進行輪循;

  中間有很多在設計日誌合并過程中一些相關工具的提示和一些嘗試的失敗經曆……

  我相信解決以上問題的路徑不止這一條途徑,以下方案肯定不是最簡便或者說成本最低的,希望能和大家有更多的交流。

1、多伺服器日誌合并統計的必要性越來越多大型的Web服務使用DNS輪循來實現負載平衡:使用多個同樣角色的伺服器做前台的WEB服務,這大大方便了服務的分布規劃和擴充性,但多個伺服器的分布使得日誌的分析統計也變得有些麻煩。如果使用webalizer等日誌分析工具對每台機器分別做日誌統計:

  1) 會對資料的匯總帶來很多麻煩,比如:統計的總訪問量需要將SERVER1 SERVER2...上指定月份的數字相加。
  2) 會大大影響統計結果中唯一訪客數unique visits,唯一網站數unique sites的等指標的統計,因為這幾個指標並非幾台機器的代數相加。

  統一日誌統計所帶來的好處是顯而易見的,但如何把所有機器的統計合并到一個統計結果裡呢?

  首先也許會想:多個伺服器能不能將日誌記錄到同一個遠程檔案裡呢?我們不考慮使用遠程檔案系統記錄日誌的問題,因為帶來的麻煩遠比你獲得的方便多的多……

  因此,要統計的多個伺服器的日誌還是:分別記錄=>並通過一定方式定期同步到後台=>合并=>後用日誌分析工具來進行分析。

  首先,要說明為什麼要合并日誌:因為webalizer沒有將同一天的多個日誌合并的功能先後運行

  webalizer log1
  webalizer log2
  webalizer log3

  這樣最後的結果是:只有log3的結果。

  能不能將log1<
  因為一個日誌的分析工具不是將日誌一次全部讀取後進行分析,而且流式的讀取日誌並按一定時間間隔,儲存階段性的統計結果。因此時間跨度過大(比如2條日誌間隔超過5分鐘),一些日誌統計工具的演算法就會將前面的結果"忘掉"。因此, log1<2、日誌合并問題多個服務的合并統計就是要把日誌按時間排序後合并成一個檔案。典型的多個記錄檔的時間欄位是這樣的:

  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

  具體的例子:

  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操作。

  日誌的按時間排序合并就是這樣實現的。

3、日誌的循環配置資源讓我們關心一下資料來源問題:webalizer其實是一個按月統計的工具,支援增量統計:因此對於大型的服務,我可以按天將apache的日誌合并後送給webalizer統計。WEB日誌是如何按天(比如每天子夜00:00:00)截斷呢?

  如果你每天使用crontab:每天0點準時將記錄備份成access_log_yesterday

  mv /path/to/apache/log/access_log /path/to/apache/log/access_log_yesterday

  的話:你還需要:馬上運行一下:apache restart 否則:apache會因為的記錄檔控制代碼丟失不知道將日誌記錄到哪裡去了。這樣歸檔每天子夜重啟apache服務會受到影響

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。