ELK培训笔记

准备工作

下载Elasticsearch 镜像,启动容器

  • docker pull elasticsearch:7.8.1该镜像暂不支持默认不写版本号的latest版本下载方式,所以需要根据Elasticsearch的dockerhub官方页面去下载指定版本的镜像

  • 下载镜像后,可以使用简单的命令先创建一个容器来测试一下是否好用,然后再启动这个镜像

    docker network create ESnet
    docker run -d --name elasticsearch --net ESnet -p 9200:9200 -p 9300:9300 -e 
    "discovery.type=single-node" elasticsearch:7.8.1
    
  • 启动之后如果日志没有报错,可以通过访问IP:9200查看是否能够打开一个Elasticsearch的信息页面,能看到就说明已经成功启动了

    clipboard

  • ES比较吃内存,如果是2G内存的服务器可能无法同时启动ES和Kibana。

  • elasticsearch-head 一个小工具,可以使用浏览器图形化管理Elasticsearch,chrome上有插件可以操作

下载Kibana镜像,启动容器

  • docker pull kibana:7.8.1该镜像不支持默认不写版本号的latest版本下载方式,也需要去官网页面找到指定版本号进行下载 官方dockerhub页面
  • docker run -p 5601:5601 --name kibana --net ESnet -e "elasticsearch.hosts=http://localhost:9200" -d kibana:7.8.1 启动Kibana,其中的net网络使用之前Elasticsearch创建的网络即可
  • 启动后可以访问IP:5601查看Kibana的主页面,注意Kibana启动较慢,可以耐心等待一会

下载logstash镜像,启动容器

  • docker pull logstash:7.8.1该镜像不支持默认不写版本号的latest版本下载方式,也需要去官网页面找到指定版本号进行下载logstash的dockerhub官方页面
  • 可以启动一个简单的容器测试一下docker run -it --rm logstash:7.8.1 -e 'input { stdin { } } output { stdout {} }' 启动之后logstash可以将当前屏幕的输入转换为logstash标准输出打印在屏幕上

启动容器

docker compose

  • 通过一个docker-compose文件,统一管理三个容器

    version: '2'
    services:
    elasticsearch:
        image: elasticsearch:7.8.1
        container_name: elasticsearch
        environment:
        - "discovery.type=single-node"
        network_mode: "host"
    kibana:
        image: kibana:7.8.1
        container_name: kibana
        volumes:
        - ./kibana.yml:/usr/share/kibana/config/kibana.yml:ro
        network_mode: "host"
    logstash:
        image: logstash:7.8.1
        container_name: logstash
        volumes:
        - ./logstash.yml:/usr/share/logstash/config/logstash.yml:ro
        - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro
        - ~/WorkSpace/ceshiren_topic/:/data/
        network_mode: "host"
        command: bash -c "logstash --config.reload.automatic"
    
  • 设置kibana和logstash的配置文件:(其中10.1.1.100是本机IP地址)

    • kibana.yml

      server.name: kibana
      server.host: "0"
      elasticsearch.hosts: [ "http://10.1.1.100:9200" ]
      monitoring.ui.container.elasticsearch.enabled: true
      i18n.locale: "zh-CN"
      
      • i18n.locale: "zh-CN" 可以配置界面为中文
    • logstash.yml

      http.host: "0.0.0.0"
      xpack.monitoring.elasticsearch.hosts: [ "http://10.1.1.100:9200" ]
      
    • logstash.conf 官方示例:https://www.elastic.co/guide/en/logstash/current/config-examples.html

      input {
          file {
              path => "/data/*.json"
              start_position=>"beginning"
      }
      }
      filter {
          json {
              source => "message"
          }
          date {
              match => ["create_time","yyyy-MM-dd HH:mm:ss"]
      }
      }
      output {
          elasticsearch {
              hosts => ["http://10.1.1.100"]
              document_id => "topic_%{topic_id}"
          }
              stdout{}
      }
      
      • logstash是通过各种plugins去实现对数据的操作功能
      • input部分是对源数据的操作,input中的file表明从文件中读取数据,path是读取数据的路径和文件名,支持使用通配符批量读取文件,start_position表示从文件起始位置读取,这样在logstash启动时,会将目录中的旧数据读取一遍,而不是只读取每个文件在启动后新增的内容。
      • 官方Input plugins介绍
      • filter是匹配规则,可以指定数据的格式,这样logstash会根据给出的格式去匹配。
      • 官方Filter plugins介绍
      • output是对输出数据的操作,可以指定输出的目的地,以及对输出数据的操作,stdout是标准输出,会打印在控制台中,能够在日志看到,初期调试的时候可以加上这个,方便对数据结果直观展示,进行调试。
      • 官方Output plugins介绍

准备数据

数据抓取、格式处理

  • 使用python循环抓取https://ceshiren.com/latest.json页面数据,根据需要获取具体的数据后,将数据拼接成符合要求的json格式字符串,写入预置的json文件中等待logstash去读取。
  • 注意,logstash对json数据的格式有要求,字段需要用双引号包裹而不是单引号,而且文件中一条json数据保存为一行比较好,不然的话logstash会将每行解析为单独的数据,导致数据结构不完整不能被认为是json格式。(可以使用jq的-c参数,将json格式压缩为每行一条数据)
  • 推荐一个工具elasticsearch head ,chrome上有插件,可以直接连接ES数据库,查看和操作数据,不过要注意,工具可以直接删除数据,这个操作要谨慎使用,如果删除了kibana的基础数据,会导致kibana无法启动。
  • 在logstash.conf文件中的输出部分配置了stdout,所以logstash抓取之后会同时打印一份数据到日志中,可以根据这个查看插入数据库的数据格式和情况,判断数据是否有问题

查看数据,制作图表

确认数据正确

  • 使用elasticsearch head查看ES里的数据,格式内容等信息是否符合预期,确认数据格式,数据数量的正确性

在kibana中加载数据,制作图表

创建一个按天统计全论坛发帖量的折线图
  • 创建折线图

  • 选中自己的数据源,进入图表编辑页面

  • 给Y轴设定一个别名,方便查看数据。按照图表要求,需要在X轴对时间做聚合,所以横轴选择Date Histogram,间隔时间根据需要选择为按天,设置完毕需要点击更新按钮才能看到设置后的结果。全部设置成功后需要保存,就可以将其添加到自己的Dashboard中进行使用了

    创建一个按用户统计总发帖量的柱状图
  • 创建柱状图

  • 选中自己的数据源,进入图表编辑页面

  • 根据图标要求,Y轴依旧是统计总和,X轴因为这次是按照数据中的字段进行聚合,所以在聚合中选择Terms选项,然后在字段中选择对应的字段,排序和展示的数据量根据需要可以自行调整,展示后发现文字是纵向排列非常不方便阅读,可以将其调整为水平展示。

    image-20200813132913100

  • 注意!每次编辑完Dashboard之后,不只是每个图表要进行保存,整个Dashboard也要进行保存!

    创建一个搜索结果信息展示列表
  • 首先在左侧菜单中切换到Discover页面

  • 在选择正确的索引之后,根据需要选择展示需要的字段,这样右侧的列表中就会根据需要展示响应的字段(因为按照时间戳排序,所以时间字段无法隐藏)

  • 设置完毕后点击页面上方的保存,将其保存为一个可视化组件,这样就可以将它添加到Dashboard中进行展示了

结果展示

1 Like

遇到的问题

  • logstash无法链接es,提示:Manticore::SocketException] Connection refused (Connection refused)"}
    • 原因:es地址配置错误,无法通信
    • 解决方法:检查logstash.conf内elasticsearch-hosts配置,设置为elasticsearch的地址
  • 启动logstash成功,但数据未成功解析,也未报错,es内也无数据
    • 原因:logstash是按行读取数据的,每条数据末尾加换行导致;通过wc -l查看文件也为0行
    • 解决方法:在数据源文件内,每条数据中间增加换行
  • es内读取数据显示不完整,将一条拆分为了多条
    • 原因:数据源内字符串内有换行符,未进行处理导致
    • 解决方法:修改数据源。
  • 重启logstash后,未解析数据
    • 原因:es内当前索引下有脏数据导致。
    • 解决方法:删除索引,重启logstash即可。
  • 通过es删除索引后,重启logstash未重新解析数据。
    • 原因:数据源未更新,logstash认为此数据源已解析过,不会进行再次解析
    • 解决方法:打开进行重新保存,更新文件修改时间即可