本文共 5635 字,大约阅读时间需要 18 分钟。
我们自己的地图服务会打印如下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的,已经不再更新,现在推荐用官网的了.不过官网的并不稳定,起码我这里经常出现被墙导致的超时.最后是通过修改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.inputs:- type: log enabled: true #待监视地址 paths: - /home/log/*.log #打开的话解析到的json字段都会挂到根节点 json.keys_under_root: true json.overwrite_keys: true json.add_error_key: truefilebeat.config.modules: path: ${ path.config}/modules.d/*.yml reload.enabled: falseoutput.logstash: hosts: ["Docker_ELK:5044"] #Docker Link后的logstash的地址 #logstash的认证文件的路径,没有它的话就会导入失败 ssl.certificate_authorities: ["/home/logstash-beats.crt"] template.enabled: false
input { beats { port => 5044 ssl => true ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt" ssl_key => "/etc/pki/tls/private/logstash-beats.key" }}
这个文件是该镜像自带的,没做修改.
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"这几个字段,将冗余的去除.
注意路径要写在容器内映射后的路径.
output { elasticsearch { hosts => ["localhost"] manage_template => trueindex => "%{[@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,保证一定按定义的模板去导入.
{ "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
-----BEGIN CERTIFICATE-----MIIC6zCCAdOgAwIBAgIJANPZwuf+5wTLMA0GCSqGSIb3DQEBCwUAMAwxCjAIBgNVBAMMASowHhcNMTUxMjI4MTA0NTMyWhcNMjUxMjI1MTA0NTMyWjAMMQowCAYDVQQDDAEqMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp+jHFvhyYKiPXc7k0c33f2QV+1hHNyW/uwcJbp5jG82cuQ41v70Z1+b2veBW4sUlDY3yAIEOPSUD8ASt9m72CAo4xlwYKDvm/Sa3KJtDk0NrQiz6PPyBUFsY+Bj3xn6Nz1RW5YaP+Q1HjnksPEyQu4vLgfTSGYBHLD4gvs8wDWY7aaKf8DfuP7Ov74Qlj2GOxnmiDEF4tirlko0rqQcvBgujCqA7rNoG+QDmkn3VrxtX8mKF72bxQ7USCyoxD4cWV2mU2HD2Maed3KHjKAvDAzSyBMjI+qi9IlPN5MR7rVqUV0VlSKXBVPct6NG7x4WRwnoKjTXnr3CRADD04uvbQQIDAQABo1AwTjAdBgNVHQ4EFgQUVFurgDwdcgnCYxszc0dWMWhB3DswHwYDVR0jBBgwFoAUVFurgDwdcgnCYxszc0dWMWhB3DswDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAaLSytepMb5LXzOPr9OiuZjTk21a2C84k96f4uqGqKV/sokTTKD0NdeY/IUIINMq4/ERiqn6YDgPgHIYvQheWqnJ8ir69ODcYCpsMXIPau1owT8c108BEHqBMEjkOQ5LrEjyvLa/29qJ5JsSSiULHvS917nVgY6xhcnRZ0AhuJkiIARKXwpO5tqJi6BtgzX/3VDSOgVZbvX1uX51Fe9gWwPDgipnYaE/t9TGzJEhKwSahkNr+7RM+Glsv9rx1KcWcx4xxY3basG3/KwvsGAFPvk5tXbZ780VuNFTTZw7q3p8OGk1zQUBOie0naS0afype5qFMPp586SF/2xAeb68gLg==-----END CERTIFICATE-----
认证文件,其实是纯文本,直接复制粘贴到对应的文件即可.
新版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吧
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 -dStarting Docker_ELK ... doneStarting Docker_Beat ... done
跑起来了.
kibana中也看到数据了
需求比较简单,其实可以直接Filebeat->ES,或者Logstash->ES.