docker 安装ELFK 实现日志统计
in Docker with 1 comment

docker 安装ELFK 实现日志统计

in Docker with 1 comment

1 概述

在Springcloud微服务中,基于docker容器化的部署应用,排查线上问题,通过日志来定位是经常使用的手段之一,甚至是最有效的。

在使用ELFK之前,我在实际使用过程中,排查问题显得十分复杂,需要进入服务器,使用docker logs -f --tail=100 容器名,来排查问题,因为没有持久化日志的原因,这样排查十分复杂,只有场景重现才能定位到问题。

后来演进持久化日志,挂载到宿主机的logs文件中,但依然相对复杂。因为考虑到线上服务为了实现高可用往往采用多节点部署,又或者随着项目愈发复杂会考虑微服务架构,导致日志分散在不同的服务器上,导致排查一个问题,需要登陆多台服务器,查询在其上的日志,非常繁琐且低效,不可能到每个机器都去查询一次,万一有100台呢?

所以,此时我们需要一个统一的实时【日志服务】,将我们需要的日志全部收集在一起,并提供灵活的查询功能。一般来说,一个完整的日志服务,需要提供如下 5 个功能:

1.1 解决方案

搜集常见的解决方案,其中ELK(Elasticsearch+Logstash+Kibana)以及ELFK(Elasticsearch + Logstash + Kibana + Filebeat),呼声最高

ELK.png

ELFK.png

从上面可以看出 ELFK是基于ELK做出的升级版本,有的朋友可能就会问了,ELK已经可以了,为什么还要在中间加个Filebeat,这样不冗余吗?

在采集日志数据时,我们需要在服务器上安装一个 Logstash。不过 Logstash 是基于 JVM 的重量级的采集器,对系统的 CPU、内存、IO 等等资源占用非常高,这样可能影响服务器上的其它服务的运行。所以,Elastic NV 推出 Beats ,基于 Go 的轻量级采集器,对系统的 CPU、内存、IO 等等资源的占用基本可以忽略不计。因此,就变成了 ELFK 。其中Beats 负责采集数据,并通过网路传输给 Logstash

1.2 Elasticsearch

FROM https://www.elastic.co/cn/products/elasticsearch
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。

1.3 Logstash

FROM https://www.elastic.co/cn/products/logstash
官方介绍:Logstash is an open source data collection engine with real-time pipelining capabilities。简单来说logstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景。

1.4 Beats

FROM https://www.elastic.co/cn/products/beats
轻量型数据采集器 :Beats 平台集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。

在 Beats 发布之后,Elastic NV 重新定义 ELK ,升级成 Elastic Stack。如下图:

image.png

Beats 是一个全品类采集器的系列,包含多个:

本小节,我们使用 Filebeat,采集日志文件。

2 部署安装

本章节是基于docker容器环境以及docker-compose编排
ELK的部署安装请参考我的上一篇文章ELK日志系统的搭建

2.1 下载Elasticsearch、Logstash、Kibana、Filebeat


docker pull elasticsearch:7.7.1
docker pull logstash:7.7.1
docker pull kibana:7.7.1

2.2 开始搭建ELFK环境

mkdir elk
cd elk
mkdir elasticsearch filebeat logstash
input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => "es:9200"
    index => "filebeat_%{[fields][log_source]}-%{+YYYY.MM.dd}"
  }
}

在 Logstash 中,我们通过定义了一个 Logstash 管道(Logstash Pipeline),来读取、过滤、输出数据。一个 Logstash Pipeline 包含三部分,如下图所示:Logstash Pipeline
【必选】输入(Input) 数据(包含但不限于日志)往往都是以不同的形式、格式存储在不同的系统中,而 Logstash 支持从多种数据源中收集数据(File、Syslog、MySQL、消息中间件等等)。
【可选】过滤器(Filter) :实时解析和转换数据,识别已命名的字段以构建结构,并将它们转换成通用格式。
【必选】输出(Output) :Elasticsearch 并非存储的唯一选择,Logstash 提供很多输出选择。

在 logstash-sample.conf 配置文件中,我们配置了 Input 和 Output。

  1. Output 比较好理解,写入数据到Elasticsearch存储器中。
  2. Input 定义了 5044 端口,接收Beats的数据。

在采集日志数据时,我们需要在服务器上安装一个 Logstash。不过 Logstash 是基于 JVM 的重量级的采集器,对系统的 CPU、内存、IO 等等资源占用非常高,这样可能影响服务器上的其它服务的运行。所以,Elastic NV 推出 Beats ,基于 Go 的轻量级采集器,对系统的 CPU、内存、IO 等等资源的占用基本可以忽略不计。

#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/logs/springboot/sparksys-authorization.log # 配置我们要读取的 Spring Boot 应用的日志
  fields:
      #定义日志来源,添加了自定义字段
    log_source: authorization
- type: log
  enabled: true
  paths:
    - /var/logs/springboot/sparksys-gateway.log
  fields:
    log_source: gateway
- type: log
  enabled: true
  paths:
    - /var/logs/springboot/sparksys-file.log
  fields:
    log_source: file
- type: log
  enabled: true
  paths:
    - /var/logs/springboot/sparksys-oauth.log
  fields:
    log_source: oauth
#================================ Outputs =====================================
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
  # Array of hosts to connect to.
  # hosts: ["192.168.3.3:9200"]

#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["logstash:5044"]

2.3 使用docker-compose.yml脚本启动ELK服务

docker-compose.yml内容

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.7.1
    container_name: elasticsearch
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms512m -Xmx1024m" #设置使用jvm内存大小
    volumes:
      - /Users/zhouxinlei/docker/elfk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - /Users/zhouxinlei/docker/elfk/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
    ports:
      - 9200:9200
    restart: always
  kibana:
    image: kibana:7.7.1
    container_name: kibana
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
    ports:
      - 5601:5601
    restart: always
  logstash:
    image: logstash:7.7.1
    container_name: logstash
    volumes:
      - /Users/zhouxinlei/docker/elfk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    ports:
      - 5044:5044
    restart: always
  filebeat:
    image: elastic/filebeat:7.7.1
    container_name: filebeat
    links:
      - logstash:logstash #可以用es这个域名访问elasticsearch服务
    volumes:
      - /Users/zhouxinlei/logs/:/var/logs/springboot/ # 宿主机实际应用日志文件映射到容器内部
      - /Users/zhouxinlei/docker/elfk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
    depends_on:
      - logstash #kibana在elasticsearch启动之后再启动
    restart: always

挂载目录可根据自身环境进行修改

2.4 使用docker-compose命令运行

docker-compose up -d

注意:Elasticsearch启动可能需要好几分钟,要耐心等待

image.png

# 进入logstash容器
docker exec -it logstash /bin/bash
# 进入bin目录
cd /bin/
# 安装插件
logstash-plugin install logstash-codec-json_lines
# 退出容器
exit
# 重启logstash服务
docker restart logstash

image.png

防火墙命令可根据自身环境进行执行

systemctl stop firewalld

image.png

image.png

image.png

image.png

3 总结

至此,我们完成了使用 Kibana 对「Beatat」收集的日志文件的日志的查询。美滋滋~
之后部署集群环境下,就不需要大量的去搜索排查问题,在Kibana根据条件筛选任意时段的任意日志数据