多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 一、前言 日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统由于实例和机器众多,所以构建一套统一日志系统是非常必要的;ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前的主流选择之一。 本文主要介绍如何实现一套`ELK日志系统`同时给**多套环境**、**多个系统**共同使用/测试,并实现相互之间的数据与视图相互**隔离**互不影响。 ## 二、隔离方式 常见的`ELK`架构如下图所示,分别由`Elasticsearch`、`Logstash`、`Kibana`与`FileBeat`组成。 ![](https://img.kancloud.cn/b7/95/b79543117fd52becd4f338498209ece3_1355x706.png) 分别在每个应用服务器里部署一个`FileBeat`组件作为日志收集器,通过输入插件从文件中获取数据,然后传输给`Logstash`将通过过滤插件加工并结构化处理日志数据后发送至`Elasticsearch`存储,最后通过`Kibana`进行可视化展示分析。 > 需要对上图中`ELK`的各个组件分别做**隔离**处理 ### 2.1. FileBeat隔离 由于每台机器上都会部署一个`Beat`实例作为日志收集,所以`FileBeat`本身无需做任何隔离配置,但是作为数据的入口需要把所属**租户**相关的信息传递给下游,如下图所示 ![](https://img.kancloud.cn/68/31/683198d547dfc99a558ca7f1647e192d_635x425.png) > 通过 project(项目名) 和 env(环境) 作为**租户**隔离标识 ### 2.2. Logstash隔离 主要是每个项目的日志格式可能会不一样,所以会存在不同的个性化配置文件,这个**日志解析配置文件**需要定义隔离规则进行分离; 使用以下命令启动`logstash`指定`config/conf/`为配置存放目录,并指定配置文件热加载。 ~~~ bin/logstash -f config/conf/ --config.reload.automatic ~~~ 日志解析配置文件隔离方法可参考下图方式: ![](https://img.kancloud.cn/8e/af/8eaff6aa35dd56a9334b9e8fa5ea2f72_613x81.png) **(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,选择**默认工作区** ![](https://img.kancloud.cn/c6/74/c674eb4f715907918f6b1fe0f3626a0b_984x867.png) ##### 2.4.1.2 进入管理页面 ![](https://img.kancloud.cn/60/93/60937a391b8473e6bce04ba8e9e5d679_323x773.png) ##### 2.4.1.3 创建工作空间 创建工作区,并可定制显示的功能点(默认全部显示) ![](https://img.kancloud.cn/23/db/23dbdba141e40b828da986e2d98cc183_2509x1005.png) #### 2.4.2 创建角色绑定工作空间 创建一个新的角色,并分配对应的`索引权限`与`工作区权限`等权限给该角色 ![](https://img.kancloud.cn/72/aa/72aacca3fda16128ec8d054093b632bf_2375x956.png) #### 2.4.3 创建用户 创建用户,并绑定自己`工作空间`下的角色 ![](https://img.kancloud.cn/20/3c/203c3434bcd53ef3f84c26e60bfd41af_1726x1165.png) > **PS**:该用户只能看到自己所属`工作区`下的`索引`和`仪表板`等对象 ## 三、总结 每个**租户**需对`ELK`的各个组件分别做**隔离**处理 1. **Filebeat**:负责把区分**租户**相关的信息传递给下游 2. **Logstash**:独立分开每个租户的个性化`Filter`配置文件 3. **Elasticsearch**:通过规范的索引命名,各租户独立的创建索引实现物理隔离 4. **Kibana**:通过多工作区的方式进行隔离,数据与仪表板等互不可见 > 隔离步骤虽然有点繁琐,但是后期大家可以自行开发产品化日志系统,把上述的步骤放在图形化界面上操作实现。