Press "Enter" to skip to content

Docker ELK搭建日志统计系统

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

架构图

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的datalogs目录放在宿主机进行持久化存储。 注意:由于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是否启动成功

访问:http://localhost:5601/

看到页面即为成功。

运行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

这里主要配置内容有

  1. 设置filebeat为输入源
  2. 内容格式为:source=www.mango.im|platform=web|version=1
  3. @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菜单,日志已经同步过来。

以上。