日誌分析是目前重要的系統調試和問題排查的重要手段之一,而目前分佈式系統因爲實例和機器衆多,因此構建一套統一日誌系統是很是必要的;ELK提供了一整套解決方案,而且都是開源軟件,之間互相配合使用,完美銜接,高效的知足了不少場合的應用,是目前的主流選擇之一。json
本文主要介紹如何實現一套 ELK日誌系統
同時給 多套環境 、多個系統 共同使用/測試,並實現相互之間的數據與視圖相互 隔離 互不影響。bash
常見的 ELK
架構以下圖所示,分別由 Elasticsearch
、Logstash
、Kibana
與 FileBeat
組成。
服務器
分別在每一個應用服務器裏部署一個 FileBeat
組件做爲日誌收集器,經過輸入插件從文件中獲取數據,而後傳輸給 Logstash
將經過過濾插件加工並結構化處理日誌數據後發送至 Elasticsearch
存儲,最後經過 Kibana
進行可視化展現分析。架構
PS:須要對上圖中
ELK
的各個組件分別作
隔離 處理
因爲每臺機器上都會部署一個 Beat
實例做爲日誌收集,因此 FileBeat
自己無需作任何隔離配置,可是做爲數據的入口須要把所屬 租戶 相關的信息傳遞給下游,以下圖所示elasticsearch
經過 project(項目名) 和 env(環境) 做爲 租戶 隔離標識
主要是每一個項目的日誌格式可能會不同,因此會存在不一樣的個性化配置文件,這個 日誌解析配置文件 須要定義隔離規則進行分離;分佈式
使用如下命令啓動 logstash
指定 config/conf/
爲配置存放目錄,並指定配置文件熱加載。測試
bin/logstash -f config/conf/ --config.reload.automatic
日誌解析配置文件隔離方法可參考下圖方式:spa
(1)01-input-beats.conf插件
爲通用 輸入 配置,每一個租戶共享,用於接收來自 Filebeat 的數據3d
input { beats { port => 5044 } }
(2)02-output-es.conf
爲通用 輸出 配置,每一個租戶共享,用於把日誌數據按照定義好的 索引命名規則 建立索引寫入到es中
須要在數據來源中添加project
、env
和docType
三個字段分別表明項目名、環境與日誌類型
output { elasticsearch { hosts => ["localhost"] user => "elastic" password => "changeme" index => "%{[fields][project]}-%{[fields][env]}-%{[fields][docType]}-%{+YYYY.MM.dd}" } }
ip、用戶名和密碼按實際狀況修改
(3)mp.conf
爲個性化 日誌解析 配置,每一個租戶單獨新建一個配置文件配置本身的 filter
內容
filter { if [fields][project] == "mp" and [fields][env] == "pre" and [fields][docType] == "syslog" { grok { .......... } } }
PS:必需增長
if
語句來確認是否屬於本身租戶的日誌數據!
經過不一樣的索引命名,建立各自獨立的索引實現物理隔離;由前面的 Logstash
在結構化數據後生成索引時,已自動經過 Filebeat
的入參變量動態生成規定的索引名。
索引的命名規則爲:${項目名}-${環境}-${日誌類型}-%{+YYYY.MM.dd}
例如:mp-pre-syslog-2020.12.01
可經過多工做區的方式進行隔離,每一個租戶建立本身獨立的工做空間,用於隔離本身的索引數據、展現視圖等對象,而且 相互不可見。
工做區的配置流程以下:
使用超級管理員帳號 elastic
登陸Kibana,選擇 默認工做區
建立工做區,並可定製顯示的功能點(默認所有顯示)
建立一個新的角色,並分配對應的 索引權限
與 工做區權限
等權限給該角色
建立用戶,並綁定本身 工做空間
下的角色
PS:該用戶只能看到本身所屬工做區
下的索引
和儀表板
等對象
每一個 租戶 需對 ELK
的各個組件分別作 隔離 處理
Filter
配置文件
PS:隔離步驟雖然有點繁瑣,可是後期你們能夠自行開發產品化日誌系統,把上述的步驟放在圖形化界面上操做實現。
掃碼關注有驚喜!