最近想把以前作過的日誌項目及我的的思考梳理一下,因而有了本文。前端
咱們這邊應用部署的環境比較複雜,主要有如下幾種:git
部署環境不統一,致使查看應用日誌很不方便。github
與部署環境對應,對於日誌收集需求分爲如下幾類:docker
具體業務需求能夠拆分爲:後端
需求已經明確了,下面看一下業界方案。安全
上圖的架構是業界比較通用的一種架構,對於各類場景都考慮的比較全。微信
既然業界的架構已經這麼完備,那麼咱們是否就直接採用呢?網絡
對於咱們而言,有如下幾個問題:架構
選擇組件,咱們這邊主要是從如下幾個方面進行考量的:app
一提到日誌收集方案,你們第一個想到的確定是ELK(Elasticsearch、Logstash、Kibana ),但Logstash依賴於JVM不論是性能仍是簡潔性,都不是日誌收集agent的首選。
我的感受一個好的agent應該是資源佔用少,性能好,不依賴別的組件,能夠獨立部署。而Logstash明顯不符合這幾點要求,也許正是基於這些考慮elastic推出了Filebeat。
Elasticsearch集羣在部署的時候,通常都是提早估計好容量、機器、shard等信息,由於Elasticsearch集羣運行後,再水平拓展,比較麻煩,而咱們這邊因爲業務及成本限制沒法很好的預估容量,因此就結合公司實際要求:使用日誌服務的業務方自帶機器,也就是業務方會有獨立的Elasticsearch集羣。
每一個業務方都使用本身的Elasticsearch集羣,因此集羣壓力不會很大,從而Collector、MQ這兩個組件對於咱們的做用也就很小了。
由於Elasticsearch Ingest Node徹底能夠知足咱們的解析需求,因此就沒有必要再引入Logstash等相關組件了。
到這裏,基本能夠看出咱們的架構以下:
架構設計的幾個原則:
- 合適優於業界領先
- 簡單優於複雜
- 演化優於一步到位
基於需求及EFK套件,梳理咱們場景中特有的東西:
具體規則及解析見下圖(實例部分處理暫未標註):
推薦寫日誌到文本文件中,使用標準輸出就好。
到這裏能夠發現咱們選擇Filebeat來做爲日誌的收集端,Elasticsearch來存儲日誌並提供檢索能力。
那麼,日誌的清洗在哪裏作呢?
日誌的清洗通常有兩種方式:
對於,咱們的場景而言,咱們須要清洗數據的要求比較簡單,主要是應用、實例名稱的截取還有文本日誌中日誌時間的處理(@timestamp重置,時區處理),因此咱們選擇了方案2。
在咱們的方案中,並無提供Kibana 的界面直接給用戶用,而是咱們本身根據公司業務獨立開發的。
前端界面爲何不採用Kibana,而須要本身開發?
log-search提供的功能能夠參見github:github.com/jiankunking…
若是日誌須要清洗的比較多,能夠採用方案1,或者先不清洗,先把數據落到Elasticsearch,而後在查詢的時候,進行處理。好比在咱們的場景中,能夠先把日誌落到Elasticsearch中,而後在須要檢索應用名稱的時候,經過代碼來處理並獲取app名字。
其實基於日誌能夠作不少事情,好比:
具體思路,能夠參見下圖:
前提:能要求使用方,按照某種規則打印日誌。 監控發展:監控基本就是先打通鏈路trace,而後再在上報信息或者日誌信息中,增強業務方面標識,即給監控添加業務維度方面的視角。
以DaemonSet方式部署Filebeat來收集日誌,其實收集也是宿主機/var/lib/docker/containers目錄下的日誌。 Running Filebeat on Kubernetes
一個POD中運行一個sidecar的日誌agent容器,用於採集該POD主容器產生的日誌。
莫名想起了istio。
Filebeat能夠以sidecar模式來進行容器日誌的收集,也就是filebeat和具體的服務容器部署在同一個pod內,指定收集日誌的路徑或文件,> 便可將日誌發送到指定位置或Elasticsearch這類的搜索引擎。 每一個pod內部署filebeat的模式,好處是和具體的應用服務低耦合,可擴展性強,不過須要在yaml進行額外配置。
我的微信公衆號:
我的github:
我的博客: