简介
ELK 是ElasticSearch、Logstash、Kibana的简称,一般用于日志系统,从日志收集,日志转储,日志展示等入手,用以提供简洁高效的日志处理机制。
ElasticSearch 是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。
Kibana 是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。
本文中ELK需要用的组件有Elasticsearch、Logstash、Kibana、Filebeat,主要介绍组件部署以及一些注意事项
环境说明
ElasticSearch部署
1 2 3 4 5 6 7 8 9 10 11
| cluster.name: "docker-cluster" network.host: 0.0.0.0
transport.host: 0.0.0.0
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
http.cors.enabled: true http.cors.allow-origin: "*"
|
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配置文件
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配置文件里指定检查日志路径。