一文纵览 ELK + Filebeat(Elastic Stack)

背景

ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

image-20220429112106526

使用Docker-Compose部署单节点 ELK-Stack(即 ELK + Filebeats)

各个组件的作用如下:

  • Filebeat:采集文件等日志数据;
  • LogStash:过滤日志数据;
  • Elastic Search:存储、索引日志;
  • Kibana:用户界面

image-20220429113159727

示例:docker-compose.yaml

version: '3.4'

services:
    elasticsearch:
        image: "docker.elastic.co/elasticsearch/elasticsearch:${ES_VERSION}"
        environment:
        		# 将ES的集群发现模式配置为单节点模式
            - discovery.type=single-node
        volumes:
		        # Docker容器中时间和宿主机同步
            - /etc/localtime:/etc/localtime
            # 将ES的数据映射并持久化至宿主机中
            - ./docker_es/data:/usr/share/elasticsearch/data
        ports:
            - "9200:9200"
            - "9300:9300"

    logstash:
        depends_on:
            - elasticsearch
        image: "docker.elastic.co/logstash/logstash:${ES_VERSION}"
        volumes:
        		# logstash 配置
            - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
        ports:
            - "5044:5044"
        links:
            - elasticsearch

    kibana:
        depends_on:
            - elasticsearch
        image: "docker.elastic.co/kibana/kibana:${ES_VERSION}"
        environment:
            - ELASTICSEARCH_URL=http://elasticsearch:9200
        volumes:
        		# Docker容器中时间和宿主机同步
            - /etc/localtime:/etc/localtime
        ports:
            - "5601:5601"
        links:
            - elasticsearch

    filebeat:
        depends_on:
            - elasticsearch
            - logstash
        image: "docker.elastic.co/beats/filebeat:${ES_VERSION}"
        user: root # 必须为root,否则会因为无权限而无法启动
        environment:
            - strict.perms=false
        volumes:
        		# filebeat 配置文件
            - ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
            # 映射到容器中[作为数据源]
            - ./docker_es/filebeat/logs:/usr/share/filebeat/logs:rw
            # 这里存储 filebeat 的状态 如果缺少状态每次重启 filebeat 都会拉去全量匹配的日志
            - ./docker_es/filebeat/data:/usr/share/filebeat/data:rw
        # 将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
        links:
            - logstash

示例 .env 文件

ES_VERSION=7.1.0 # 设置 docker-compose 的环境变量

示例:filbeat.yml

filebeat.inputs:
# 输入filebeat的类型,包括log(具体路径的日志),stdin(键盘输入),redis,udp,docker,tcp,syslog,可以同时配置多个(包括相同类型的)

# 具体的每种类型的配置信息可以通过官网:https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html 了解
  - type: log
  	# 配置是否生效
    enabled: true
    paths:
      # 容器中目录下的所有.log文件
      - /usr/share/filebeat/logs/*.log
    # 额外添加的tag标签
    tags: ["mylog"]
    # 向输出的每一条日志添加额外的信息,比如“appname:xapp”,方便后续对日志进行分组统计。
  	# 默认情况下,会在输出信息的fields子目录下以指定的新增fields建立子目录,例如fields.appname
  	# 这个的意思就是会在es中多添加一个字段,格式为 "filelds":{"appname":"xapp"}
    fields: 
      appname: "xapp"

# 加载 module 没有特殊需要无需调整
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  # 是否允许重新加载
  reload.enabled: false
  # 重新加载的时间间隔()
  #reload.period: 10s

# Elasticsearch模板配置
setup.template.settings:
	# 数据分片数
  index.number_of_shards: 1
  
# 是否启用仪表盘
setup.dashboards.enabled: false

# kibana 配置
setup.kibana:
	# kibana地址
  host: "http://kibana:5601"

# 直接传输至ES
#output.elasticsearch:
# hosts: ["http://es-master:9200"]
# index: "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"

# 传输至LogStash
output.logstash:
  hosts: ["logstash:5044"]

processors:
	# 主机相关 信息
  - add_host_metadata: ~
  # 云服务器的元数据信息,包括阿里云ECS 腾讯云QCloud AWS的EC2的相关信息 
  - add_cloud_metadata: ~	

示例:logstash.conf

input {

  # 来源beats
  beats {
      # 端口
      port => "5044"
  }

}

filter {
    json {
        source => "message" # 从 message 解析
        remove_field => "message"  # 丢弃掉日志中的 message 字段
        target => "logdata" # 将 json 解析出的数据 输出到 logdata 字段
    }
    date {
    		# 将 ts 的数据取出 通过 "UNIX_MS", "yyyy-MMM-dd'T'HH:mm:ss.SSS+0800", "ISO8601" 三种匹配模式 匹配数据
        match => ["ts","UNIX_MS", "yyyy-MMM-dd'T'HH:mm:ss.SSS+0800", "ISO8601"]
        remove_field => "ts"  # 丢弃掉日志中的 ts 字段
    }
}

output {
  # 输出到 es
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    # 设置索引为 fields 字段 下的 appname 字段 拼上 日期 ( [fields][appname] 由 filebeat 传入,也可以在日志中加入 app_name 字段用于区分服务)
    index => "%{[fields][appname]}-%{+YYYY-MM-dd}"
  }
  # 输出到命令行 用于debug
  stdout { codec => rubydebug }
}

简单使用

进入 Kibana

打开 http://localhost:5601

管理index

image-20220503170448584

创建 Index Patterns

image-20220503170948671

查看日志

点击 Discover 查看日志

image-20220503171059730


好好学习,天天向上