## 一、前言
日志分析是目前重要的系統調試和問題排查的重要手段之一,而目前分布式系統由于實例和機器眾多,所以構建一套統一日志系統是非常必要的;ELK提供了一整套解決方案,并且都是開源軟件,之間互相配合使用,完美銜接,高效的滿足了很多場合的應用,是目前的主流選擇之一。
本文主要介紹如何實現一套`ELK日志系統`同時給**多套環境**、**多個系統**共同使用/測試,并實現相互之間的數據與視圖相互**隔離**互不影響。
## 二、隔離方式
常見的`ELK`架構如下圖所示,分別由`Elasticsearch`、`Logstash`、`Kibana`與`FileBeat`組成。

分別在每個應用服務器里部署一個`FileBeat`組件作為日志收集器,通過輸入插件從文件中獲取數據,然后傳輸給`Logstash`將通過過濾插件加工并結構化處理日志數據后發送至`Elasticsearch`存儲,最后通過`Kibana`進行可視化展示分析。
> 需要對上圖中`ELK`的各個組件分別做**隔離**處理
### 2.1. FileBeat隔離
由于每臺機器上都會部署一個`Beat`實例作為日志收集,所以`FileBeat`本身無需做任何隔離配置,但是作為數據的入口需要把所屬**租戶**相關的信息傳遞給下游,如下圖所示

> 通過 project(項目名) 和 env(環境) 作為**租戶**隔離標識
### 2.2. Logstash隔離
主要是每個項目的日志格式可能會不一樣,所以會存在不同的個性化配置文件,這個**日志解析配置文件**需要定義隔離規則進行分離;
使用以下命令啟動`logstash`指定`config/conf/`為配置存放目錄,并指定配置文件熱加載。
~~~
bin/logstash -f config/conf/ --config.reload.automatic
~~~
日志解析配置文件隔離方法可參考下圖方式:

**(1)01-input-beats.conf**
為通用**輸入**配置,每個租戶共享,用于接收來自 Filebeat 的數據
~~~
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`語句來確認是否屬于自己租戶的日志數據!
### 2.3. Elasticsearch隔離
通過不同的索引命名,創建各自獨立的索引實現物理隔離;由前面的`Logstash`在結構化數據后生成索引時,已自動通過`Filebeat`的入參變量動態生成規定的索引名。
索引的命名規則為:${項目名}-${環境}-${日志類型}-%{+YYYY.MM.dd}
> 例如:mp-pre-syslog-2020.12.01
### 2.4. Kibana隔離
可通過多工作區的方式進行隔離,每個租戶創建自己獨立的工作空間,用于隔離自己的索引數據、展示視圖等對象,并且**相互不可見**。
工作區的配置流程如下:
1. 創建工作區
2. 創建角色(配置權限)
3. 創建用戶(關聯角色)
#### 2.4.1 創建工作空間
##### 2.4.1.1 超級管理員登錄
使用超級管理員賬號`elastic`登錄Kibana,選擇**默認工作區**

##### 2.4.1.2 進入管理頁面

##### 2.4.1.3 創建工作空間
創建工作區,并可定制顯示的功能點(默認全部顯示)

#### 2.4.2 創建角色綁定工作空間
創建一個新的角色,并分配對應的`索引權限`與`工作區權限`等權限給該角色

#### 2.4.3 創建用戶
創建用戶,并綁定自己`工作空間`下的角色

> **PS**:該用戶只能看到自己所屬`工作區`下的`索引`和`儀表板`等對象
## 三、總結
每個**租戶**需對`ELK`的各個組件分別做**隔離**處理
1. **Filebeat**:負責把區分**租戶**相關的信息傳遞給下游
2. **Logstash**:獨立分開每個租戶的個性化`Filter`配置文件
3. **Elasticsearch**:通過規范的索引命名,各租戶獨立的創建索引實現物理隔離
4. **Kibana**:通過多工作區的方式進行隔離,數據與儀表板等互不可見
> 隔離步驟雖然有點繁瑣,但是后期大家可以自行開發產品化日志系統,把上述的步驟放在圖形化界面上操作實現。
- springcloud
- springcloud的作用
- springboot服務提供者和消費者
- Eureka
- ribbon
- Feign
- feign在微服務中的使用
- feign充當http請求工具
- Hystrix 熔斷器
- Zuul 路由網關
- Spring Cloud Config 分布式配置中心
- config介紹與配置
- Spring Cloud Config 配置實戰
- Spring Cloud Bus
- gateway
- 概念講解
- 實例
- GateWay
- 統一日志追蹤
- 分布式鎖
- 1.redis
- springcloud Alibaba
- 1. Nacos
- 1.1 安裝
- 1.2 特性
- 1.3 實例
- 1. 整合nacos服務發現
- 2. 整合nacos配置功能
- 1.4 生產部署方案
- 環境隔離
- 原理講解
- 1. 服務發現
- 2. sentinel
- 3. Seata事務
- CAP理論
- 3.1 安裝
- 分布式協議
- 4.熔斷和降級
- springcloud與alibba
- oauth
- 1. abstract
- 2. oauth2 in micro-service
- 微服務框架付費
- SkyWalking
- 介紹與相關資料
- APM系統簡單對比(zipkin,pinpoint和skywalking)
- server安裝部署
- agent安裝
- 日志清理
- 統一日志中心
- docker安裝部署
- 安裝部署
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- ES索引管理
- 定時清理數據
- index Lifecycle Management
- 沒數據排查思路
- ELK自身組件監控
- 多租戶方案
- 慢查詢sql
- 日志審計
- 開發
- 登錄認證
- 鏈路追蹤
- elk
- Filebeat
- Filebeat基礎
- Filebeat安裝部署
- 多行消息Multiline
- how Filebeat works
- Logstash
- 安裝
- rpm安裝
- docker安裝Logstash
- grok調試
- Grok語法調試
- Grok常用表達式
- 配置中常見判斷
- filter提取器
- elasticsearch
- 安裝
- rpm安裝
- docker安裝es
- 使用
- 概念
- 基礎
- 中文分詞
- 統計
- 排序
- 倒排與正排索引
- 自定義dynamic
- 練習
- nested object
- 父子關系模型
- 高亮
- 搜索提示
- kibana
- 安裝
- docker安裝
- rpm安裝
- 整合
- 收集日志
- 慢sql
- 日志審計s
- 云
- 分布式架構
- 分布式鎖
- Redis實現
- redisson
- 熔斷和降級