简介
- “ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。
- Elasticsearch 是一个搜索和分析引擎。
- Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。
- Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化(以上内容摘自elastic官网)。
开始搭建
- 首先,让我们从elastic官网下载三个项目,请注意,务必下载相同版本号的安装包。我这里使用的是7.12.0版本。
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-12-0
https://www.elastic.co/cn/downloads/past-releases/kibana-7-12-0
https://www.elastic.co/cn/downloads/past-releases/logstash-7-12-0
- 将下载的安装包解压,安装要在非root用户下进行。
es安装与配置
- es有两个默认端口,外部通信端口默认9200,走的是HTTP协议;集群内部通信端口默认9300,走的是TCP协议;
- 由于我是在开发机上安装的,公司内部有端口限制,所以我这里将外部通信端口改为8920。
vi /home/work/es/elasticsearch-7.12.0/config/elasticsearch.yml
- 接下来我们启动es:
/home/work/es/elasticsearch-7.12.0/bin/elasticsearch
- 在浏览器中访问下服务:
kibana安装与配置
- kibana的默认端口是5600,我这里修改为8956
- 由于我的es和kibana部署在同一台机器上,所以修改elasticsearch.hosts为
http://localhost:8920
,该配置是个数组形式,我们目前只有一个节点,所以数组中只有一个元素。 - 执行命令启动:
/home/work/es/kibana-7.12.0-linux-x86_64/bin/kibana
- 通过浏览器访问,可以看到kibana已经启动:
logstash的安装和配置
- logstash采集数据的流程包含三个阶段,对应配置文件中的三个部分:
- logstash的配置稍微复杂些,因为需要针对日志做字段处理,配置文件如下:
input {
file {
path => ["/home/work/go/src/icode.baidu.com/baidu/games/gameapi/log/service/*","/home/work/go/src/icode.baidu.com/baidu/games/ms-game/log/service/*"]
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
grok {
match => {
"message" => "(?<level>\S+): (?<time>(?<date>\d+-\d+-\d+) \d+:\d+:\d+).*logid\[(?<logid>\d+)\].*err\[(?<err>\d+)\].*api\[(?<api>\w+)\].*status\[(?<status>\w+)\].*appname\[(?<appname>.*?)\].*cost\[(?<cost>.*?)\].*errno\[(?<errno>\d+)\].*idc\[(?<idc>\w+)\].*client_ip\[(?<client_ip>.*?)\].*local_ip\[(?<local_ip>.*?)\].*method\[(?<method>\w+)\].*uri\[(?<uri>.*)\].*host\[(?<host_addr>.*?)\].*"
}
}
date {
match => ["time", "YYYY-MM-dd HH:mm:ss"]
}
mutate {
convert => ["err", "integer"]
convert => ["errno", "integer"]
convert => ["status", "integer"]
convert => ["cost", "float"]
remove_field => ["path", "host","message","time"]
}
}
output {
elasticsearch {
hosts => "http://10.12.75.61:8920"
index => "log-%{date}"
}
stdout {}
}
- input 指定采集方式是文件、start_position指定从文件头部开始采集。sincedb_path保存的采集位置记录文件的输出路径,/dev/null表示不记录,每次重启logstash都会从头开始采集。
- filter主要做字段处理,首先使用grok插件,使用正则匹配和提取字段。然后对时间字段做格式化。最后转换了一些字段的类型。
- output指定输出方式,这里同时输出到我的es和控制台,es索引名称以log开头,每天一个索引。
日志采集之后
- 创建索引模式,打开kibana侧面菜单,Stack Management - > 索引模式。
- 创建好索引模式后,可以在Discover中按照时间和条件筛选日志
- 也可以配置自己的dashboard,支持各种图表。