最近需要搭建一个日志统计服务,主要统计各个业务点用户使用数据。经过一段时间摸索,确定使用ELK架构实现,当然真实架构比下面要复杂些,这里只是记录下搭建过程。
架构图

环境
系统:Centos 7.5 Docker版本:18.06.1-ce 软件:Elasticsearch,Filebeat,Logstash,Kibana 版本均为6.7.0
下载镜像
docker pull elasticsearch:6.7.0
docker pull kibana:6.7.0
docker pull docker.elastic.co/beats/filebeat:6.7.0
docker pull logstash:6.7.0
运行镜像
运行Elasticsearch
docker run -d --name elasticsearch \
-v /opt/docker_workspace/elk/elasticsearch/data:/usr/share/elasticsearch/data \
-v /opt/docker_workspace/elk/elasticsearch/logs:/usr/share/elasticsearch/logs \
-p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.7.0
这里挂载了ES的data和logs目录放在宿主机进行持久化存储。 注意:由于ES Docker内使用elasticsearch用户操作,挂载到宿主目录也需要和Docker用户权限保持一致。
ELK均是使用宿主用户shareuser,更改宿主目录权限:chown shareuser:root -R dir
验证ES是否启动成功
curl得到如下内容即为成功。
curl http://localhost:9200/
{
"name": "R86BqrT",
"cluster_name": "docker-cluster",
"cluster_uuid": "yeHcuSOlTCm0O12pK5xhfg",
"version": {
"number": "6.7.0",
"build_flavor": "default",
"build_type": "docker",
"build_hash": "8453f77",
"build_date": "2019-03-21T15:32:29.844721Z",
"build_snapshot": false,
"lucene_version": "7.7.0",
"minimum_wire_compatibility_version": "5.6.0",
"minimum_index_compatibility_version": "5.0.0"
},
"tagline": "You Know, for Search"
}
运行Kibana
docker run -d --name kibana --link elasticsearch -p 5601:5601 kibana:6.7.0
这里注意到启动命令使用—link elasticsearch,—link命令作为Docker内部通信方式之一,其本质为在Docker内部/etc/hosts增加一条DNS解析记录。这样可以避免容器重启IP变动问题。
验证Kibana是否启动成功
看到页面即为成功。
运行Logstash
docker run --name logstash --link elasticsearch -v /opt/docker_workspace/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -p 5044:5044 logstash:6.7.0
logstash.conf
这里主要配置内容有
设置filebeat为输入源 内容格式为:source=www.mango.im|platform=web|version=1 @timestamp用客户端时间
input {
beats {
port => "5044"
}
}
filter {
kv {
source => "message"
field_split => "|"
value_split => "="
}
date {
match => ["client_time", "yyyy-MM-dd'T'HH:mm:ssZ"]
target => "@timestamp"
remove_field => ["client_time"]
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
}
stdout {
codec => rubydebug
}
}
启动Filebeat
docker run --link kibana --link logstash -v /opt/docker_workspace/elk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /opt/docker_workspace/elk/filebeat/logs/:/usr/share/filebeat/logs docker.elastic.co/beats/filebeat:6.7.0
filebeat.yml
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
#processors:
#- add_cloud_metadata: ~
filebeat.inputs:
- input_type: log
paths:
- /usr/share/filebeat/logs/*.log
document_type: filebeat
setup.kibana.host: kibana:5601
output.logstash:
hosts: ["logstash:5044"]
测试
在/opt/docker_workspace/elk/filebeat/logs/下新建文件键入如下内容:
source=www.mango.im|platform=web|version=1 查看Kibana logs菜单,日志已经同步过来。