日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统因为实例和机器众多,因此构建一套统一日志系统是很是必要的;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:隔离步骤虽然有点繁琐,可是后期你们能够自行开发产品化日志系统,把上述的步骤放在图形化界面上操做实现。
扫码关注有惊喜!