简介

ELK 是ElasticSearch、Logstash、Kibana的简称,一般用于日志系统,从日志收集,日志转储,日志展示等入手,用以提供简洁高效的日志处理机制。

ElasticSearch 是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。

Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。

Kibana 是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。

本文中ELK需要用的组件有Elasticsearch、Logstash、Kibana、Filebeat,主要介绍组件部署以及一些注意事项

环境说明

  • 本文采用docker镜像版本均为7.6.1

ELK架构图

ElasticSearch部署

  • elasticsearch.yml
1
2
3
4
5
6
7
8
9
10
11
cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 访问ID限定,0.0.0.0为不限制,生产环境请设置为固定IP
transport.host: 0.0.0.0
# elasticsearch节点名称
node.name: node-1
# elasticsearch节点信息
cluster.initial_master_nodes: ["node-1"]
# 下面的配置是关闭跨域验证
http.cors.enabled: true
http.cors.allow-origin: "*"
  • docker命令
1
2
3
4
5
6
7
docker run -di \
-p 9200:9200 \
-p 9300:9300 \
-v /d/docker/elk/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /d/docker/elk/elasticsearch/data:/usr/share/elasticsearch/data \
--name elasticsearch \
elasticsearch:7.6.1

Kibana部署

Kibana配置文件

  • kibana.yml
1
2
3
4
5
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch:9200"]
# 操作界面语言设置
i18n.locale: "zh-CN"

Docker启动Kibana命令

这里通过docker--link来链接已经创建好的elasticsearch容器,kibana容器内部可以通过容器名:端口形式进行访问,Kibana配置文件里可以这样设置 elasticsearch.hosts: ["http://elasticsearch:9200"]

1
2
3
4
docker run -di \
-p 5601:5601 \
-v /d/docker/elk/kibana.yml:/usr/share/kibana/config/kibana.yml \
--link elasticsearch:elasticsearch --name kibana kibana:7.6.1

Logstash部署

Logstash配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
input {
beats {
port => 5044
}
}
filter{
grok {
match => {
"message" => "%{TIMESTAMP_ISO8601:date}\s*\[%{DATA:ip}\]\s*\[%{DATA:thread}\]\s*%{LOGLEVEL:level}\s*%{NOTSPACE:clazz}\s*-\s*%{DATA:method}\s*(?<body>[\S\s]*)"
}
remove_field => ["@timestamp","host","@version"]
}
grok {
match => {
"source" => "/app/logs/%{NOTSPACE:project}/"

}
}
mutate {
add_field => {
"env" =>"%{[fields][env]}"
}

remove_field => ["fields","tags","offset","input_type","beat"]
}
mutate {
replace => ["date","%{date}+0800"]
}
date {
match => ["date", "yyyy-MM-dd HH:mm:ss.SSSZ"]
target => "@timestamp"

}
}
output {
# 这个是logstash的控制台打印(进行安装调试的开启,稍后成功后去掉这个配置即可)
stdout {
codec => rubydebug
}
# elasticsearch配置
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "testindex"
document_type => "testlog"
}
}

Docker启动Logstash命令

1
2
3
4
5
6
docker run -di \
-p 5044:5044 \
-v /d/docker/elk/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
--link elasticsearch:elasticsearch \
--name logstash \
logstash:7.6.1

Filebeat部署

Filebeat配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
filebeat.inputs:
- type: log
enabled: true
paths:
- /app/logs/**/*.log
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
fields:
env: dev-1
output.logstash:
enabled: true
hosts: ["logstash:5044"]
output.console:
enabled: false
pretty: true

Docker启动Filebeat命令

1
2
3
4
5
6
7
docker run -di \
-v /d/docker/elk/filebeat/logs:/app/logs \
-v /d/docker/elk/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /d/docker/elk/filebeat/data:/usr/share/filebeat/data \
--link logstash:logstash \
--name filebeat \
elastic/filebeat:7.6.1

Filebeat模拟数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"@timestamp": "2020-03-26T13:47:32.219Z",
"beat": {
"hostname": "943d74347f9c",
"name": "943d74347f9c",
"version": "7.6.1"
},
"fields": {
"env": "dev-1"
},
"input_type": "log",
"message": "2020-03-26 21:47:31.684 [10.111.12.217] [New I/O worker #16] DEBUG c.a.dubbo.remoting.exchange.support.header.HeartbeatHandler - [DUBBO] Receive heartbeat response in thread New I/O worker #16, dubbo version: server, current host: 10.111.12.217",
"offset": 11517459,
"source": "/app/logs/ttms-server/ttms-server-dubbo.log",
"type": "log"
}

该文件放在在/app/logs文件夹下,Filebeat配置文件里指定检查日志路径。