常用的日志收集系統有Syslog-ng,Scribe,Flume,當然還有ELK的LogStash.而目前互聯網公司最長用的時Scribe和Flume,Scibe是Facebook開源的,但是現在已經不維護,所以不推薦使用。
Scribe
Scribe是Facebook開源的日志收集系統,在facebook內部已經得到大量的應用。Scribe是基於一個非阻斷C++服務的實現。它能夠從各種日志源上收集日志,存儲到一個中陽存儲系統。
三個角色:
- 日志服務器
- 為了收集日志,每一台日志服務器上都會部署一個scribe客戶端,它包含兩個模塊agent 和 local_server
- Agent是以tail的方式讀取本地目錄下的日志文件,並將數據寫到本地的Local_server
- local_server通過zookeeper定位到Center_server
- 中心服務器
- 中心服務器作用就是把散落在各個機器的日志統一收集起來
- Center_server和Local_server一樣,只是配置不同,通過thrift進行通信
- center_server收到數據后,根據配置將各個category的數據發向不同的方向,比如寫到HDFS或者發到Kafka等
- 存儲服務器
- 最終存儲日志的地方
- 供計算框架以及搜索引擎框架計算使用
LogStash
Logstash是ELK中的一個工具,在ELK中起到的作用是對日志進行收集、分析、過濾。
上圖所示,由三個組件組成:
- 數據來源,支持較多輸入源的插件
- beats
- file
- http
- jdbc
- kafka
- log4j
- ...
- 過濾器
- json
- csv
- ...
- 輸出目的地
- file
- mongodb
- rabbitmq
- kafka
Flume
Flume是分布式的、可靠的、高性能、可擴展的的日志收集框架。
Flume的Agent
Agent由三部分組成:
- Source: 數據源
- Channel:包括兩種fileChannel和Memorychannel
- Sink:輸出目的地
三個角色:
- 客戶端日志收集層
- 在每個客戶端部署一個Agent進程,負責對單機的日志手機工作
- 中心服務器
- Collector層部署在中心服務器上,負責接收Agent層發送的日志,並且將日志根據路由規則寫到響應的Store層
- 存儲層
對比
-
Scribe:C++編寫,現在已經不再維護,不推薦使用
-
Logstash: 針對日志收集,搜索,計算,可視化有一系列的產品,並且可使用的插件以及社區較為活躍推薦使用
-
Flume: Java編寫,較為靈活,並且吞吐量高。業界已經驗證過,建議使用。
總結
從上面可以看出日志收集框架基本都是三個組件:
-
Agent : 部署在各個應用服務器,來收集應用的日志
-
Collector: 日志收集中心,把分散在Agent的統一統一收集到日志中心
-
Storage: 存儲層,日志收集之后的存儲
注:
這里的日志收集框架只是最簡單的,如果數據量過大,以及考慮數據收集的可靠。可以在中間添加kafka或者redis等中間件,保證可靠以及緩沖等作用。