1. ELK+Filebeat简介

ELK是ElasticsearchLogstashKibana的简称,这三者是核心套件实现日志采集分析展示

Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。

Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。

Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。

Filebeat隶属于Beats。目前Beats包含四种工具:

  • Packetbeat(搜集网络流量数据)
  • Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
  • Filebeat(搜集文件数据)
  • Winlogbeat(搜集 Windows 事件日志数据)

2. 整体架构

3. Docker安装ElasticSearch

  • 2.1 官网安装
docker pull elasticsearch:7.12.1
  • 2.2 设置参数

在elasticsearch的docker版本文档中,官方提到了vm.max_map_count的值在生产环境最少要设置成262144。
设置的方式有两种

永久性的修改,/etc/sysctl.conf文件中添加一行:

vm.max_map_count=262144 # 修改或者新增

正在运行的机器:

sysctl -w vm.max_map_count=262144
  • 2.3 创建本地挂载数据与配置文件

数据储存路径

mkdir -p /usr/local/elk/es

把宿主机es挂载的目录的权限开启就行了

chmod -R 777 /usr/local/elk/es

2.3 修改配置文件

配置文件路径

/usr/local/elk/es/config/elasticsearch.yml

elasticsearch.yml

# 配置es的集群名称
cluster.name: "docker-cluster"
# 0.0.0.0为不限制,生产环境请设置为固定IP
network.host: 0.0.0.0
# 开启x-pack安全验证 访问时需要密码
xpack.security.enabled: true
# 关闭跨域验证(可以不开启)
http.cors.enabled: true
http.cors.allow-origin: "*"

参数说明:

xpack.security.enabled: truees从6.3之后内置了xpack模块,但是是默认关闭的

  • 2.4 启动命令
docker run -d \
--name es \
-p 9200:9200 \
-p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v /usr/local/elk/es/data:/usr/share/elasticsearch/data \
-v /usr/local/elk/es/logs:/usr/share/elasticsearch/logs \
-v /usr/local/elk/es/plugins:/usr/share/elasticsearch/plugins \
-v /usr/local/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
--privileged \
elasticsearch:7.12.1
  • docker run -d \ # 后台运行

  • --name es \ # elasticsearch容器名称

  • -p 9200:9200 \ # 端口映射配置

  • -p 9300:9300 \ # 端口映射配置

  • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ # 内存大小

  • -e "discovery.type=single-node" \ # 非集群模式

  • -v /usr/local/elk/es/data:/usr/share/elasticsearch/data \ # 挂载逻辑卷,绑定es的数据目录

  • -v /usr/local/elk/es/logs:/usr/share/elasticsearch/logs \ # 挂载逻辑卷,绑定es的日志目录

  • -v /usr/local/elk/es/plugins:/usr/share/elasticsearch/plugins \ # 挂载逻辑卷,绑定es的插件目录

  • -v /usr/local/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ # 挂载逻辑卷,绑定es启动yml的配置

  • --privileged \ # 授予逻辑卷访问权

  • elasticsearch:7.12.1

  • 2.5 设置密码

#docker 进入容器
docker exec -it es /bin/bash
#执行bin/elasticsearch-setup-passwords interactive 命令后
#你将进入交互式模式,该模式将引导你完成设置和更改密码的过程。
bin/elasticsearch-setup-passwords interactive
  • 2.6 配置开放端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent   # 开放端口
firewall-cmd --reload   # 配置立即生效
firewall-cmd --zone=public --list-ports  # 查看防火墙所有开放的端口
  • 2.7 测试是否成功

打开浏览器输入ip:9200即可

可以看到需要验证用户密码,输入刚刚设置的密码即可

用户名: elastic
密码: xxxx

成功后会看到以下内容

OK! es安装完毕

4. Docker安装Logstsh

  • 3.1 拉取官方镜像

    docker pull logstash:7.12.1
    
  • 3.2 创建挂载目录、以及相关配置

    mkdir -p /usr/local/elk/logstash/config
    mkdir -p /usr/local/elk/logstash/data
    mkdir -p /usr/local/elk/logstash/pipeline
    
    • 设置JVM堆内存大小

       vim /usr/local/elk/logstash/config/jvm.options
      
      -Xmx128m
      -Xms128m
      
    • Logstash配置

      vim /usr/local/elk/logstash/config/logstash.yml
      
      # 允许通过本机所有IP访问
      http.host: "0.0.0.0"
      # 指定使用管道ID
      xpack.management.pipeline.id: ["main"]
      # 使用了es安全认证所以要配置es相关信息
      xpack.monitoring.elasticsearch.hosts:
      - http://ip:9200
      # 使用x-pack安全认证
      xpack.monitoring.enabled: true
      # es账号
      xpack.monitoring.elasticsearch.username: "elastic" 
      # es密码
      xpack.monitoring.elasticsearch.password: "xxx"
      
    • 管道ID和配置文件路径映射

      vim /usr/local/elk/logstash/config/pipelines.yml 
      # 注意符号 - 前后都要有空格(巨坑)
       - pipeline.id: main
         path.config: "/usr/share/logstash/pipeline"
      
    • Logstash.conf配置

      logstash pipeline 包含两个必须的元素:input和output,和一个可选元素:filter。

      从input读取事件源,(经过filter解析和处理之后),从output输出到目标存储库(elasticsearch/其他)

      logstash.conf配置详情

      vim /usr/local/elk/logstash/pipeline/logstash.conf
      
     input {
       beats {
         port => 5044
         client_inactivity_timeout => 36000
       }
     }
     filter {
       mutate {
             remove_field => ["@version"]
             remove_field => ["tags"]
       }
     }
     output {
       if [appname] == "auth" {
         elasticsearch {
           hosts => "http://192.168.0.106:9200"
           index => "auth"
         }
       }else if [appname] == "gateway" {
         elasticsearch {
           hosts => "http://192.168.0.106:9200"
           index => "gateway"
         }
       }else if [appname] == "system" {
         elasticsearch {
           hosts => "http://192.168.0.106:9200"
           index => "system"
         }
       }
       stdout {}
     }
    
    
  • 3.3 启动命令

docker run -d --name logstash --restart always \
-p 5044:5044 -p 9600:9600 \
-v /usr/local/elk/logstash/config:/usr/share/logstash/config \
-v /usr/local/elk/logstash/data:/usr/share/logstash/data \
-v /usr/local/elk/logstash/pipeline:/usr/share/logstash/pipeline \
logstash:7.12.1 
  • docker run -d \ # 后台运行

  • --name logstash \ # logstash容器名称

  • --restart always \ # 开机启动

  • -p 5044:5044 -p 9600:9600 \ # 端口映射配置

  • -v /usr/local/elk/logstash/config:/usr/share/logstash/config \ # 挂载逻辑卷,绑定logstash配置

  • -v /usr/local/elk/logstash/data:/usr/share/logstash/data \ # 挂载逻辑卷,绑定logstash数据目录

  • -v /usr/local/elk/logstash/pipeline:/usr/share/logstash/pipeline \ # 挂载逻辑卷,绑定logstash管道配置

  • logstash:7.12.1

  • 3.5 查看启动日志

docker logs -f logstash

5. Docker安装Kibana

  • 4.1 安装

拉取官方镜像

docker pull docker.elastic.co/kibana/kibana:7.12.1
  • 4.2 创建文件夹和配置文件
mkdir /usr/local/elk/kibana
mkdir /usr/local/elk/kibana/config
  • 4.3 修改配置
vim /usr/local/elk/kibana/config/kibana.yml

配置文件

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.username: elastic
elasticsearch.password: xxx
xpack.monitoring.ui.container.elasticsearch.enabled: true
#汉化
i18n.locale: "zh-CN"
  • 4.4 启动命令
docker run -d -p 5601:5601 \
--name=kibana \
-v /usr/local/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
docker.elastic.co/kibana/kibana:7.12.1

使用link参数,会在kibana容器hosts文件中加入elasticsearch ip地址,这样我们就直接通过定义的name来访问es服务

  • 4.5 启动测试
    打开浏览器访问ip:5601


然后输入账号密码即可

6. Docker安装Filebeat

  • 5.1 安装
    拉取官方镜像
docker pull docker.elastic.co/beats/filebeat:7.12.1
  • 5.2 在宿主机创建文件夹和文件
mkdir -p /usr/local/elk/filebeat/data
mkdir -p /usr/local/elk/filebeat/config
  • 5.3 修改配置文件
vim /usr/local/elk/filebeat/config/filebeat.yml

filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
  - /home/ap/logs/auth/*.log
  fields:
    appname: auth  # 自定义字段,提供给 Logstash 用于区分日志来源
  fields_under_root: true  # 开启自定义字段
- type: log
  enabled: true
  paths:
  - /home/ap/logs/gateway/*.log
  fields:
    appname: gateway
  fields_under_root: true

- type: log
  enabled: true
  paths:
  - /home/ap/logs/system/*.log
  fields:
    appname: system
  fields_under_root: true


processors:
  - drop_fields:
      fields: ["log","input","host","agent","ecs"] # 过滤不需要的字段

output.logstash:
  hosts: ['192.168.0.106:5044']

注: Logstash的配置

output:
    logstash:
        hosts: ["ip:5044"]
        worker: 2
        loadbalance: true
        index: filebeat
 
#这里worker 的含义,是 beat 连到每个 host 的线程数。
#在  loadbalance  开启的情况下,意味着有 4 个worker 轮训发送数据
  • 5.4 启动命令
docker run -d --name filebeat --restart=always \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2  \
-v /usr/local/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /usr/local/filebeat/data:/usr/share/filebeat/data \
-v /home/ap/logs:/home/ap/logs \
elastic/filebeat:7.12.1
  • docker run -d \ # 后台运行

  • --name filebeat \ # filebeat容器名称

  • --restart=always \ # 开机启动

  • --log-driver json-file \ # 指定日志驱动、文件格式

  • --log-opt max-size=100m \ # 限制文件最大大小

  • --log-opt max-file=2 \ # 限制文件最大数量

  • -v /usr/local/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \ # 挂载逻辑卷,绑定filebeat配置

  • -v /usr/local/filebeat/data:/usr/share/filebeat/data \ # 挂载逻辑卷,绑定filebeat数据

  • -v /home/ap/logs:/home/ap/logs \ # 挂载逻辑卷,绑定日志所在目录

  • elastic/filebeat:7.12.1

  • 5.5 查看启动日志是否成功

docker logs -f filebeat

OK! 到现在为止,基础软件安装完毕!

7. 总结

本文章主要架构为:

filebeat 读取 logback 日志文件,发送到 logstash ,再由 logstash 发送到 es 进行储存,最终 kibana 展示

可以做到代码无侵入性,随时用随时撤

注意: 软件启动顺序,先启动es,再启动kibana,logstash,filebeat