前言

大数据时代,业务无时不刻在产生大量数据。如何挖掘这些数据的价值,已经成为每个公司的必修课。

工欲善其事,必先利其器,一款方便高效的工具,可以辅助我们实时洞察源源不断产生的数据,发现其中的价值。

ELK Stack 正是在这样一款工具。

准确来说 ELK Stack 是一组工具集合,可以完成数据采集、清洗过滤、运输存储、索引查询、交互式探索、可视化报表等一系列工作。

本小册全面介绍 ELK Stack 包含的各个组件及其使用方法,让零基础的读者也能轻松搭建整个套件,并运用到实际的生产环境中。

在示例中,我们将打造一个大规模日志实时分析系统,实现每天数十亿条日志或者 PB 级数据的分析处理。

事不宜迟,马上开始!

什么是 ELK Stack

elk stack

ELK 是 3 款开源软件 Elasticsearch / Logstash / Kibana 的简称,基于这 3 款软件及其相关组件组成的数据处理系统称之为 ELK Stack。

从上面的架构图可以清晰地看到各个组件以栈[Stack]的形式构成整个系统。

由于系统涉及的组件越来越多,比如 Filebeat、Metricbeat、Kafka、Zookeeper 等,而不仅仅是 ELK,所以 ELK Stack 也逐渐被称为 Elastic Stack。

下面,简单介绍 Elastic Stack 涉及的各个组件:

Elasticsearch

Elasticsearch 是一个搜索和分析引擎,主要负责将日志索引并存储起来,方便业务方检索查询

Elasticsearch

Logstash

Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中

Logstash

Kibana

Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化

Kibana

Kafka

在生产环境中,为了提升系统的稳定性和可扩展性,会增加一层消息队列中间件,用来「削峰填谷」,从容应对各类突发流量,保障后端日志索引服务的平稳性。

Kafka 正是这样一款分布式消息队列服务中间件。

Kafka

Filebeat

Filebeat 是轻量型日志采集器,用于转发和汇总日志与文件,让简单的事情不再繁杂。

Filebeat

小结

基于 Elastic Stack 可以轻松打造大规模日志实时分析处理系统。

所谓「大规模」,指的是 Elastic Stack 支持每天收集、处理、索引数十甚至上百亿规模的各类日志,这主要得益于 Filebeat、Kafka、Logstash、Elasticsearch 都支持分布式部署,可以无限水平扩展。

各类文本形式的日志都在处理范围,本小册以最常见的 Nginx 访问日志为例,演示如何搭建大规模日志实时分析处理系统。对访问日志的实时分析,可以帮助我们随时掌握业务的运行状况、统计 PV/UV、发现异常流量、分析用户行为、查看热门站内搜索关键词等。

演示环境安装与配置

本地开发环境

为了深入理解各个组件的使用,建议读者在本地搭建一个开发环境。

为了解决系统环境和依赖的问题,本小册使用 Docker 容器运行各个组件,并使用 Docker Compose 进行服务编排,实现可「一键启动」的开发环境。

Docker 下载与安装

Docker 是一种容器化技术,可以将软件及其依赖的运行环境打包进一个容器中,和虚拟机不同的是,Docker 容器非常轻量,可以实现秒级的启动或关闭。

Docker Desktop for Windows/Mac

为了支持 Windows 和 Mac 操作系统,Docker 开发了 Docker Desktop for Windows/Mac

以下是 Docker Desktop 运行起来的界面:

Docker Desktop for Mac

可以通过设置页面,配置足够的计算资源:

Docker Desktop Resource

Docker for Linux

由于 Docker 源于 Linux 虚拟化技术,所以对 Linux 操作系统支持的很好。

安装参见 https://docs.docker.com/engine/install/

启动 Docker

Docker Desktop for Windows/Mac 安装完成后,直接双击图标就可以启动:

Docker Desktop start

Docker for Linux 安装完成后,需要先启动 Docker 服务:

service docker start

启动成功后,可以在命令行查看 Docker 相关信息:

# docker version
Client: Docker Engine - Community
 Version:           19.03.7
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        7141c199a2
 Built:             Wed Mar  4 01:24:10 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.7
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       7141c199a2
  Built:            Wed Mar  4 01:22:45 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0

如果没有启动成功,则会报错:

# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Docker Compose

有了 Docker 后我们可以轻松运行各种软件,但是对于一个大型系统,涉及很多服务,以及服务之间的依赖关系。

如果手动处理各个服务、网络配置等计算资源,效率低下且容易出错。

这个时候可以使用 Docker Compose 编排这些服务,实现大型系统的「一键启动」

Docker Compose

Docker 配置

本小册演示环境的所有配置都已经开源并托管在 Github ,下载地址:

系统配置目录结构如下所示:

.
├── docker-compose.yml
├── elasticsearch
│   ├── config
│   │   └── elasticsearch.yml
│   └── Dockerfile
├── .env
├── filebeat
│   ├── Dockerfile
│   └── filebeat.yml
├── kibana
│   ├── config
│   │   └── kibana.yml
│   └── Dockerfile
├── logstash
│   ├── config
│   │   └── logstash.yml
│   ├── Dockerfile
│   └── pipeline
│       ├── logstash.conf
│       └── nginx.conf
└── nginx
    ├── html
    │   └── index.html
    └── nginx.conf

其中 .env 文件声明使用 7.6.2 版本的 Elastic Stack:

ELK_VERSION=7.6.2

如果你想测试其他版本的 Elastic Stack,只需修改ELK_VERSION参数即可。

一键启动

上述配置文件中,docker-compose.yml 声明了我们需要的服务以及如果构建这些服务。

Docker 安装并启动后,执行以下命令即可「一键启动」整个开发环境:

cd learn-elk.git/docker-compose/

docker-compose -f "docker-compose.yml" up -d --build
# 运行结果
Creating network "learn-elkgit_elk" with driver "bridge"
Creating network "learn-elkgit_default" with the default driver

Building elasticsearch
Step 1/2 : ARG ELK_VERSION
Step 2/2 : FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
 ---> f29a1ee41030
Successfully built f29a1ee41030
Successfully tagged learn-elkgit_elasticsearch:latest
Building logstash
Step 1/2 : ARG ELK_VERSION
Step 2/2 : FROM docker.elastic.co/logstash/logstash:${ELK_VERSION}
 ---> fa5b3b1e9757
Successfully built fa5b3b1e9757
Successfully tagged learn-elkgit_logstash:latest
Building kibana
Step 1/2 : ARG ELK_VERSION
Step 2/2 : FROM docker.elastic.co/kibana/kibana:${ELK_VERSION}
 ---> f70986bc5191
Successfully built f70986bc5191
Successfully tagged learn-elkgit_kibana:latest
Building filebeat
Step 1/2 : ARG ELK_VERSION
Step 2/2 : FROM docker.elastic.co/beats/filebeat:${ELK_VERSION}
 ---> 0272ee9a7757
Successfully built 0272ee9a7757
Successfully tagged learn-elkgit_filebeat:latest
Creating learn-elkgit_nginx_1         ... done
Creating learn-elkgit_zookeeper_1     ... done
Creating learn-elkgit_elasticsearch_1 ... done
Creating learn-elkgit_kafka_1         ... done
Creating learn-elkgit_kibana_1        ... done
Creating learn-elkgit_logstash_1      ... done
Creating learn-elkgit_filebeat_1      ... done
Creating learn-elkgit_kafdrop_1       ... done
Creating learn-elkgit_metricbeat_1    ... done

注意:首次启动的时候,需要下载镜像文件,可能需要数十分钟,请耐心等候一下

如果你使用 VSCode 编辑器 并且 安装了 Docker 插件,那么你可以看到运行中的容器状态:

Docker Containers

小结

本小节介绍了在线演示环境使用、本地开发环境搭建,在这个过程中读者也对整个系统有了大概的认识。

接下来,我们深入每个模块,了解其配置和运行环境。

常见问题

  • filebeat 启动报错:
Exiting: error loading config file: 
config file ("filebeat.yml") can only be writable by the owner but the permissions are "-rw-rw-r--" 
(to fix the permissions use: 'chmod go-w /usr/share/filebeat/filebeat.yml')

原因:

如果在 Linux 系统下启动,需要保证 filebeat 配置文件的读写权限正确,否则 Filebaet 容器无法启动并报错

解决方法:

修改 filebeat 配置文件权限 chmod 644 filebeat.yml

Nginx 访问日志

Nginx 服务配置

在 docker-compose.yaml 对于 Nginx 服务的配置中:

 nginx:
    image: nginx:1.18
    ports:
    - "8000:80"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
      - "./nginx/html:/usr/share/nginx/html:ro"
      - type: volume
        source: nginx-log
        target: /var/log/nginx
  • 使用 Nginx 1.18 版本的官方镜像,默认使用的镜像仓库地址为: https://hub.docker.com/_/nginx
  • 将宿主机的 8000 端口映射到到 Nginx 容器内的 80 端口,这样就可以通过宿主机地址访问容器内服务
  • 数据卷映射:
    • 将宿主机目录下的配置文件 以及 html 目录映射到容器内相应的目录,这样容器内应用就可以访问宿主机上的文件或目录
    • 使用宿主机上名为 nginx-log 的数据卷,并映射到容器内的 /var/log/nginx 目录,目的是让运行在同一宿主机上的容器之间共享目录
    • Filebeat 容器也会用到 nginx-log 数据卷,在这个目录收割 Nginx 访问日志

Nginx 配置

对于 nginx/nginx.conf 配置:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/elk-error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent $request_time "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/elk-access.log  main;

    sendfile        on;
    gzip  on;
    
    server {
        listen       80;

        rewrite ^(.*)$ /index.html;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    }
}

通过配置 Nginx 日志格式,可以将每个用户的访问信息记录到日志中,主要包括以下字段:

  • $remote_addr 用户 ip 地址
  • $remote_user 用户标识
  • $time_local 服务器时间
  • $request http 请求头信息,包括 http method / uri / http 版本
  • $status 服务器响应状态码,例如 200/302/404/504
  • $body_bytes_sent 服务器响应内容大小(单位 bytes)
  • $request_time 请求处理时间
  • $http_referer 请求来源 referer
  • $http_user_agent 用户系统/浏览器等信息
  • $http_x_forwarded_for 网络代理 ip 列表(如果使用代理)

日志示例:

#tail -f /var/log/nginx/elk-access.log 
192.168.0.1 - - [26/May/2020:12:31:31 +0000] "GET /api/news/view HTTP/1.0" 404 555 0.000 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "-"
192.168.0.1 - - [26/May/2020:12:31:32 +0000] "GET /api/app/update HTTP/1.0" 404 555 0.000 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "-"
192.168.0.1 - - [26/May/2020:12:31:32 +0000] "GET /api/user/login HTTP/1.0" 404 555 0.000 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "-"

这些日志将被 Filebeat 采集后投递到 Kafka 消息队列,再经过 Logstash 的格式化处理后,索引到 Elasticsearch 中,最后通过 Kibana 可视化查询。

运行效果

Nginx Web

Filebeat 日志收割

Filebeat 服务配置

在 docker-compose.yaml 对于 Filebeat 服务的配置中:

filebeat:
    build:
      context: filebeat/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - "./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro"
      - type: volume
        source: nginx-log
        target: /var/log
    depends_on:
      - nginx
    networks:
      - elk
  • 使用 filebeat/ 目录下的 Dockerfile 构建镜像
  • 数据卷映射:
    • 将宿主机目录下的配置文件映射到容器内
    • 使用宿主机上名为 nginx-log 的数据卷,并映射到容器内的 /var/log 目录,这和 Nginx 容器使用的是同一个目录
  • Filebeat 服务依赖于 Nginx 服务,所以 Docker Compose 会先启动 Nginx ,然后再启动 Filebeat
  • 使用名为 elk 的子网络,这样便可以访问同样使用这个子网络的其他容器

Filebeat 日志收割配置

对于 filebeat/filebeat.yml 配置:

filebeat.inputs:
  - type: log
    paths:
      - /var/log/*access.log
    encoding: utf-8
    fields:
      topic: nginx-log
    scan_frequency: 1s
    harvester_buffer_size: 16384
    tail_files: false
    close_eof: true
    clean_removed: true
  
processors:
  - drop_fields:
      fields: ["ecs", "input", "host", "agent", "log.offset"]
      ignore_missing: true

#------------------------------- Kafka output ---------------------------------
output.kafka:
  enabled: true
  hosts: ["kafka:9092"]
  topic: elk-%{[fields.topic]}
  worker: 2
  keep_alive: 60
  required_acks: 1

Filebeat 通过配置 input / processors / output 模块,实现日志收集、预处理、投递等工作

对于 input 模块:

  • type 配置数据来源的类型,例如 文本日志 log 或者 控制台输出 stdout
  • paths 指定日志的路径,可以使用模糊匹配,例如 /var/log/*access.log
  • encoding 日志的编码,例如 utf-8
  • fields 自定义添加的字段,例如 增加一个主题字段 topic: nginx-log
  • scan_frequency: 1s 扫描日志文件的间隔
  • harvester_buffer_size: 16384 日志收割缓存大小
  • tail_files: false 启动 filebeat 后,是否从目标日志文件的结尾开始收集
  • close_eof: true 采集日志到文件结尾的时候,是否关闭采集进程
  • clean_removed: true 采集目标日志文件被移除后,是否从 filebeat registry 清楚

更全面的配置信息,请参考:

对于 processors 模块:

  • drop_fields 可以舍弃部分多余字段

对于 output 模块:

  • output.kafka 将收集的日志投递到 Kafka 消息队列
  • hosts: ["kafka:9092"] 指定 Kafka 服务的地址
  • topic: elk-%{[fields.topic]} 指定投递到 Kafka 消息队列的频道
  • keep_alive: 60 Filebeat 和 Kafka 之间保持连接的时间
  • required_acks: 1 日志消息投递后,是否需要等待 Kafka 的确认反馈

更全面的配置信息,请参考:

小结

Filebeat 启动后,开始监听目标文件,当发现新日志后就收集转发出去。

Kafka 消息队列

Kafka 服务配置

在 docker-compose.yaml 对于 Kafka 服务的配置中:

  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
    networks:
      - elk
  
  kafka:
    image: wurstmeister/kafka:2.12-2.1.0
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: $HOST_IP
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_HEAP_OPTS: "-Xmx512M -Xms512M"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - zookeeper
    networks:
      - elk

  kafdrop:
    image: obsidiandynamics/kafdrop
    ports:
      - "9000:9000"
    environment:
      KAFKA_BROKERCONNECT: kafka:9092
      JVM_OPTS: "-Xms32M -Xmx64M"
      SERVER_SERVLET_CONTEXTPATH: "/"
    depends_on:
      - kafka
    networks:
      - elk
  • Kafka 依赖 zookeeper 提供分布式状态存储服务
  • 注意选择 Kafka 的版本和 ELK 兼容,这里选的是 wurstmeister/kafka:2.12-2.1.0
  • 使用名为 elk 的子网络,这样便可以访问同样使用这个子网络的其他容器
  • 使用 Kafka 可视化管理工具 Kafdrop 可以查看 Kafka 当前运行状态

Kafdrop 可视化管理后台

Kafdrop 是一款 Kafka web ui 软件,支持丰富的管理功能,包括:

  • 查看 Kafka 节点
  • 查看/创建 Topics
  • 浏览消息
  • 查看 consumer groups
  • ...

Kafka Overview

小结

Kafka 作为消息队列服务,具有高吞吐、低延迟、高并发、高可用等优点,应用到 Elastic Stack 中可以显著提升整个系统的稳定性。

成百上千的 Filebeat 实例可以即时地将大量日志转发到 Kafka,再由 Logstash 按照阈值能力慢慢处理,达到「削峰填谷」的效果。

Logstash 处理日志

Logstash 服务配置

在 docker-compose.yaml 对于 Logstash 服务的配置中:

  logstash:
    build:
      context: logstash/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./logstash/config/logstash.yml
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: ./logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
    ports:
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: "-Xmx256m -Xms256m"
    networks:
      - elk
    depends_on:
      - elasticsearch
  • 使用 logstash/ 目录下的 Dockerfile 构建镜像
  • 数据卷映射:
    • 将宿主机目录下的配置文件映射到容器内
  • 使用名为 elk 的子网络,这样便可以访问同样使用这个子网络的其他容器

Logstash Pipeline 配置

logstash/pipeline/nginx.conf 配置:

### INPUTS
input {
    kafka  {
      codec => "json"
      topics_pattern => "elk-nginx-log"
      bootstrap_servers => "kafka:9092"
      auto_offset_reset => "latest"
      group_id => "nginx-log"
    }
}

### FILTERS
filter {

    grok {

      #获取 Nginx 日志字段
      match => {
          "message" => [
          #Nginx access log 格式
          # 172.19.0.1 - - [21/May/2020:09:34:14 +0000] "GET /index.html?f=hello HTTP/1.1" 200 5 0.000 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36" "-"
          '%{IPV4:ip} - - \[%{HTTPDATE:[@metadata][timestamp]}\] "%{WORD:method} %{URIPATH:path}(?:%{GREEDYDATA:query}|) HTTP/%{NUMBER}" %{NUMBER:status} (?:%{NUMBER:body_bytes_sent}) (?:%{NUMBER:request_time}) %{QS:http_referer} %{QS:http_user_agent} %{QS:http_x_forwarded_for}'
          ]
      }

      remove_field => ["message"]
    }
    
    if [path] {

      # 过滤日志
      if [path] =~ /\.js|css|jpeg|jpg|png|gif|ico|swf|svg$/ {
        drop {}
      }

      #获取 日志 时间
      date {
          match => [ "[@metadata][timestamp]", "dd/MMM/yyyy:HH:mm:ss Z" ]
          remove_field => ["input_type", "offset", "tags", "beat" ]
      }

      mutate {
          #转换数据类型
          convert => [
              "status" , "integer",
              "body_bytes_sent" , "integer",
              "request_time", "float"
          ]
      }

      if [query] {
        kv {
          prefix => "p_"
          source => "query"
          field_split => "&?"

          #只存储感兴趣参数
          #include_keys => [ "uid", "vn" ]
          remove_field => ["query" ]
        }

        #url 解码
        urldecode {
          all_fields => true
        }
      }
    }
}


### OUTPUTS

output {

  elasticsearch {
    hosts => "elasticsearch:9200"
    index => "logstash-%{[fields][topic]}-%{+YYYY.MM.dd.HH}"
  }
}

Logstash pipeline 配置主要分为 3 个部分: input/filter/output

对于 input 模块:

对于 filter 模块:

对于 output 模块:

关于 Grok

Grok 是正则匹配工具,更多正则模式请参考 https://grokdebug.herokuapp.com/patterns#

Grok Debugger

Elasticsearch 索引日志

Elasticsearch 服务配置

在 docker-compose.yaml 对于 Elasticsearch 服务的配置中:

  elasticsearch:
    build:
      context: elasticsearch/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./elasticsearch/config/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - type: volume
        source: elasticsearch
        target: /usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx512m -Xms512m"
      ELASTIC_PASSWORD: changeme
      # Use single node discovery in order to disable production mode and avoid bootstrap checks
      # see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
      discovery.type: single-node
    networks:
      - elk
  • 使用 elasticsearch/ 目录下的 Dockerfile 构建镜像
  • 数据卷映射:
    • 将宿主机目录下的配置文件映射到容器内
    • 使用宿主机上名为elasticsearch 的数据卷,并映射到容器内的 /usr/share/elasticsearch/data 目录,这样可以长久保存日志数据
  • 使用名为 elk 的子网络,这样便可以访问同样使用这个子网络的其他容器

Kibana 分析日志

Kibana 服务配置

在 docker-compose.yaml 对于 Kibana 服务的配置中:

  kibana:
    build:
      context: kibana/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./kibana/config/kibana.yml
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch
  • 使用 kibana/ 目录下的 Dockerfile 构建镜像
  • 数据卷映射:
    • 将宿主机目录下的配置文件映射到容器内
  • 使用名为 elk 的子网络,这样便可以访问同样使用这个子网络的其他容器

运行效果

Kibana Welcome

查询日志

创建 Index Pattern

Nginx 访问日志经过收集、过滤、索引后就可以通过 Kibana 查询,但是查询之前需要指定索引 index pattern:

Kibana Index Pattern

如上述截图示例,在 Kibana 管理 > Index Patterns > Creata Index Pattern 进入创建页面:

kibana-create-index-pattern

Index Pattern 的名称是由 Logstash 配置的时候确定的:

#logstash/pipeline/nginx.conf

output {

  elasticsearch {
    hosts => "elasticsearch:9200"
    index => "logstash-%{[fields][topic]}-%{+YYYY.MM.dd.HH}"
  }
}

查询日志

在搜索框输入要查询的字段的值,同时在右侧选择时间区间,就可以开始查询索引的日志:

Kibana Query

查询语法

  • 精准查询:

    • ip:"192.168.42.10"
    • path:"/api/user/login"
    • status:404
  • 模糊查询:

    • p_key:"关键词*"
  • AND 与查询:

    • ip:"192.168.42.10" AND status:404
  • OR 或查询:

    • ip:"192.168.42.10" OR status:404
    • (ip:"192.168.42.10" AND status:404) OR (ip:"192.168.42.11" AND status:503)
  • NOT 非查询:

    • NOT ip:"192.168.42.10"
  • 比较查询:

    • status >= 500

更多查询语法,参考 https://www.elastic.co/guide/en/kibana/7.7/kuery-query.html

可视化

Kibana 可以创建 面积图、饼图、折线图、表格、直方图、热力图、地理分布图等各种样式的可视化图表:

Visualize

面积图示例

Area

饼图示例

Pie

TSVB示例

TSVB

Dashbord

创建 Dashbord

将上一节创建的可视化图表聚合到一个页面上就是 Dashbord,有了实时大盘便可以全面感知业务运行状态。

首先需要新建一个 Dashbord,然后加入可视化图表:

Dashbord 示例

Dashbord

结语

恭喜你!完成了整个 Elastic Stack 的学习。

现在,你拥有了搭建大规模日志实时分析系统的能力,马上试试应用的实际工作中去吧!

关于作者

  • 关注作者微信:

Ceelog