从零开始的Docker ELK+Filebeat 6.4.0日志管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011609113/article/details/82875799

我们自己的地图服务会打印如下json格式的日志:(时间字段和位置字段已针对ELK的处理)

{"apikey":"XXXXXXX","ip":"192.168.3.208","tilesize":"512","x":100,"y":100,"z":10,"layer":"XXX","apiversion":"XXX","location":"33.1582,112.0155","@timestamp":"2018-09-25T10:50:20+08:00"}

准备搭建一个地图服务的日志统计管理系统,我需要搭建一个怎样的环境呢?

Elasticsearch(以下简称ES):作为核心引擎,接受日志消息
Kibana:作为数据监控与展示的平台,当然,后期可能会增加其他的展示平台
Logstash:作为向Elasticsearch导入日志数据的通道
Logstash-GeoIP:作为解析IP地址为经纬度坐标的Logstash插件.
Filebeat:作为轻量级的输入流,将本地日志读入Logstash中

这一切我都准备利用Docker作为环境(运行环境是Ubuntu 16.04 LTS)

通过Docker搭建这个ELK系统,本身应该是比较方便的,不过实际上却走了相当多弯路.主要原因有一下几点.

  • ELK的版本变化问题.

    ELK的2.x,5.x,6.x在大方面与小细节上都有不小的差异.尤其是小细节的差异,也足够使整个环境都无法正常运行.而国内的相关教程很多并没有明确自己用的是那个版本,结果根本不起作用

  • Docker数据源的问题

    DockerHub的数据源还是5.x的,已经不再更新,现在推荐用官网的了.不过官网的Docker源并不稳定,起码我这里经常出现被墙导致的超时.最后是通过修改dns为8.8.8.8解决了问题

修改 /etc/resolv.conf 文件,第一行加一句:nameserver 8.8.8.8

这里我选择的是镜像sebp/elk,一下子将相同版本的ELK整合在一个镜像里了.此时官网最高版本是6.4.1,这里没有更新,还是6.4.0,不过一点也不影响使用就是了.

FileBeat选用的是官网的镜像.

原先用的是prima/filebeat.版本是6.2.3,不知道是什么原因,死活监视不到日志变动,所以就换回了官网镜像

由于我已经在测试环境调试过配置文件,那在这里就一次性把ELK+Filebeat的配置全部调好.

我个人习惯将所有配置文件放到一个大文件夹里

文件结构如下

在这里插入图片描述

每个文件的内容如下

filebeat/my.yml

filebeat.inputs:
- type: log
  enabled: true
  #待监视地址
  paths:
    - /home/log/*.log
  #打开的话解析到的json字段都会挂到根节点
  json.keys_under_root: true
  json.overwrite_keys: true
  json.add_error_key: true
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
output.logstash:
  hosts: ["Docker_ELK:5044"] #Docker Link后的logstash的地址
  #logstash的认证文件的路径,没有它的话就会导入失败
  ssl.certificate_authorities: ["/home/logstash-beats.crt"]
  template.enabled: false

logstash

logstash/conf.d/02-beats-input.conf
input {
  beats {
    port => 5044
    ssl => true
    ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
    ssl_key => "/etc/pki/tls/private/logstash-beats.key"
  }
}

这个文件是该镜像自带的,没做修改.

logstash/conf.d/12-geoip.conf
filter{
 geoip{
  source => "ip"
  database => "/home/GeoLite2-City.mmdb"
fields=>["city_name","country_code2","country_name", "region_name","location"]
 }
}

指定了ip在日志中的字段,数据库的位置(在docker中挂载的位置),以及geoip插件导入elasticsearch后的字段,只显示"city_name",“country_code2”,“country_name”, “region_name”,"location"这几个字段,将冗余的去除.

注意路径要写在容器内映射后的路径.

logstash/conf.d/30-output.conf
output {
  elasticsearch {
    hosts => ["localhost"]
    manage_template => true
index => "%{[@metadata][beat]}-%{+YYYY.MM.DD}"
    document_type => "%{[@metadata][type]}"
    template_name => "filebeat"
    template => "/home/template.json"
    template_overwrite => true
  }
}

指定了模板的路径,因为未使用ES中定义的模板,所以我觉得设置模板名没什么用.

将template_overwrite和manage_template 都设为true,保证一定按定义的模板去导入.

logstash/filebeat_template.json

{
 "index_patterns": "filebeat-*",
 "settings": {
  "index.number_of_shards": 3,
  "number_of_replicas": 0
 },
 "mappings": {
  "doc": {
   "dynamic_templates": [{
    "location": {
     "match": "location",
     "mapping": {
      "type": "geo_point"
     }
    }
   }]
  }
 }
}

导入ES的模板文件.采用动态模板.除了地理坐标字段,其他的都让ES自己判定

模板这个坑比较大,因为ES 6.x系列的模板格式似乎发生了改变,很多旧的模板已经没法用了.

如果模板格式错误或没找到,会报

Got response code ‘400’ contacting Elasticsearch at URL

logstash/logstash-beats.crt
-----BEGIN CERTIFICATE-----
MIIC6zCCAdOgAwIBAgIJANPZwuf+5wTLMA0GCSqGSIb3DQEBCwUAMAwxCjAIBgNV
BAMMASowHhcNMTUxMjI4MTA0NTMyWhcNMjUxMjI1MTA0NTMyWjAMMQowCAYDVQQD
DAEqMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp+jHFvhyYKiPXc7k
0c33f2QV+1hHNyW/uwcJbp5jG82cuQ41v70Z1+b2veBW4sUlDY3yAIEOPSUD8ASt
9m72CAo4xlwYKDvm/Sa3KJtDk0NrQiz6PPyBUFsY+Bj3xn6Nz1RW5YaP+Q1Hjnks
PEyQu4vLgfTSGYBHLD4gvs8wDWY7aaKf8DfuP7Ov74Qlj2GOxnmiDEF4tirlko0r
qQcvBgujCqA7rNoG+QDmkn3VrxtX8mKF72bxQ7USCyoxD4cWV2mU2HD2Maed3KHj
KAvDAzSyBMjI+qi9IlPN5MR7rVqUV0VlSKXBVPct6NG7x4WRwnoKjTXnr3CRADD0
4uvbQQIDAQABo1AwTjAdBgNVHQ4EFgQUVFurgDwdcgnCYxszc0dWMWhB3DswHwYD
VR0jBBgwFoAUVFurgDwdcgnCYxszc0dWMWhB3DswDAYDVR0TBAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAQEAaLSytepMb5LXzOPr9OiuZjTk21a2C84k96f4uqGqKV/s
okTTKD0NdeY/IUIINMq4/ERiqn6YDgPgHIYvQheWqnJ8ir69ODcYCpsMXIPau1ow
T8c108BEHqBMEjkOQ5LrEjyvLa/29qJ5JsSSiULHvS917nVgY6xhcnRZ0AhuJkiI
ARKXwpO5tqJi6BtgzX/3VDSOgVZbvX1uX51Fe9gWwPDgipnYaE/t9TGzJEhKwSah
kNr+7RM+Glsv9rx1KcWcx4xxY3basG3/KwvsGAFPvk5tXbZ780VuNFTTZw7q3p8O
Gk1zQUBOie0naS0afype5qFMPp586SF/2xAeb68gLg==
-----END CERTIFICATE-----

认证文件,其实是纯文本,直接复制粘贴到对应的文件即可.

logstash/GeoLite2-City.mmdb

新版GeoIP的数据库,暂时对GEOIP的需求比较低,所以暂不考虑定时更新的问题.

直接下载,解压即可

wget [http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz](http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz)
tar -zxvf GeoLite2-City.tar.gz

OK,至此,所有准备工作都完成了.开始编写Docker-compose吧

Docker-compose.yml
version: '2'
services:
  ELK:
    image: sebp/elk
    ports:
        - "5601:5601"
        - "9200:9200"
        - "5044:5044"
    volumes:
        - /home/kz/elasticstack/logstash/filebeat_template.json:/home/template.json
        - /home/kz/elasticstack/logstash/GeoLite2-City.mmdb:/home/GeoLite2-City.mmdb
        - /home/kz/elasticstack/search:/var/lib/elasticsearch
        - /home/kz/elasticstack/logstash/conf.d:/etc/logstash/conf.d
    restart: always
    container_name: Docker_ELK
  FileBeat:
    image: docker.elastic.co/beats/filebeat:6.4.1
    volumes:
        - /home/kz/elasticstack/filebeat/my.yml:/usr/share/filebeat/filebeat.yml
        # 把打log的路径挂载到Docker上
        - /home/kz/wms_server:/home/log
        # 挂载认证证书
        - /home/kz/elasticstack/filebeat/logstash-beats.crt:/home/logstash-beats.crt
        # 挂载module,没用上
        - /home/kz/elasticstack/filebeat/module:/module
    restart: always
    container_name: Docker_Beat
    # 这里的依赖其实没什么用,因为ELK整体彻底启动需要的时间比较长,这里只是调整一下顺序
    depends_on:
        - ELK
    links:
        - ELK
kz@kz-desktop:~/elasticstack$ docker-compose up -d
Starting Docker_ELK ... done
Starting Docker_Beat ... done

跑起来了.
在这里插入图片描述

kibana中也看到数据了

在这里插入图片描述

需求比较简单,其实可以直接Filebeat->ES,或者Logstash->ES.

猜你喜欢

转载自blog.csdn.net/u011609113/article/details/82875799