SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_数据 本篇讲述使用 Docker部署 ELK+ Filebeat环境 ,通过轻量级日志采集工具 Filebeat来采集日志,并将日志推送给Logstash,经过 Logstash 的过滤筛选后将数据存入ES,最终日志通过 Kibana 呈现。希望能够帮助快速入门 Elastic 技术栈。


一. 前言

日志对于一个程序的重要程度不用过多的言语修饰,本篇将以实战的方式讲述开源微服务全栈项目 ​​有来商城​​​ 是如何整合当下主流日志解决方案 ​​ELK​​​ +​​Filebeat​​ 。 话不多说,先看实现的效果图,绝不搞些浪费大家时间且没意义的东西。

SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_数据_02

二. Elastic Stask 技术栈

1. 为什么引入 Filebeat ?

​ELK ​​​ 作为分布式日志解决方案让人为之津津乐道,即使没有实践过也能耳熟,可见其火热程度。 ​​Beats​​​ 作为数据采集器后来加入进来 Elastic 家族,​​ELK​​​正式更名为 ​​Elastic Stack​​​。 在属于 ​​ELK​​​ 的那个时代,数据采集是由 ​​Logstash​​​ 完成,还有比 ​​Filebeat​​​ 更为强大的过滤处理能力,这样便不禁让人心生疑问,为什么还要引入 ​​Filebeat​​​ 呢?是多此一举吗?先看下官方给 ​​Beats​​的解释:


轻量型,从源头采集,简单明了。

Beats 能够采集符合 ​​Elastic Common Schema (ECS)​​ 要求的数据,如果您希望拥有更加强大的处理能力,Beats 能够将数据转发至 Logstash 进行转换和解析。


其中重点的关键字从源头收集,更加轻量。

​Logstash​​​ 拥有比 ​​Filebeat​​​ 更为丰富的功能,但能力越大,背负的越多,意味着 ​​Logstash​​​ 作为采集工具会比 ​​Filebeat​​​ 占用更多的系统资源。其中有个依据​​Logstash​​​ 默认的堆内存大小是 1G,​​Filebeat​​ 占用内存仅仅大概是 10M 左右。

2. ELK +Filebeat 日志解决方案流程

​Filebeat​​​ 会定时监听事先指定的日志文件,如果日志文件有变化,会将数据推送至 ​​Logstash​​​ ,经过 ​​Logstash​​​ 过滤筛选处理将我们想要的日志数据存入​​ElasticSearch​​​,最终通过 ​​Kibana​​ 将数据呈现出来。

三. 环境准备

实战环境这里我使用 ​​有来商城​​ 线上云服务器做的,因服务器资源有限所以做了堆内存保守的设置,大家可以用虚拟机测试。

????服务器

配置

开放端口

说明

内存

e.youlai.tech

1核2G

5044 ,5601, 9200

ELK部署服务器

ELK+IK分词器实际占用1.4G

f.youlai.tech

1核2G

SpringBoot 应用端口

Filebeat + SpringBoot 应用部署服务器

300M±

四. 自定义网络

保证同一网络下的容器 (ElasticSearch、Logstash、Kibana)相互访问。


  • 创建自定义网络​​elk​​​​docker network create elk ​
  • 查看已有网络
    ​docker network ls ​​Docker自带3种网络模式 bridge、host、none
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_docker_03

​Docker 自定义网络模式​


删除已有网络
​docker network rm elk ​

五. ELK 部署

1. ElasticSerach 部署


  1. 创建目录
    ​mkdir -p /opt/elasticsearch/{config,data} chmod 777 /opt/elasticsearch/{config,data} ​
  2. 拉取镜像

​Docker Hub 镜像仓库查看 Elastic Search 最新版本​

​docker pull elasticsearch:7.14.1 ​配置文件
创建配置文件elasticsearch.yml
​vi /opt/elasticsearch/config/elasticsearch.yml ​​添加配置信息
​# 允许通过本机所有IP访问 http.host: 0.0.0.0 # 是否支持跨域,默认为false http.cors.enabled: true http.cors.allow-origin: "*" ​创建和启动容器
​docker run -d --name elasticsearch --net elk --restart always \ -p 9200:9200 -p 9300:9300 \ -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \ -e "discovery.type=single-node" \ -v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /opt/elasticsearch/data:/usr/share/elasticsearch/data \ elasticsearch:7.14.1 ​​JVM堆内存大小设置 128M 时,安装 IK 分词器的时候会报错,建议堆内存设置至少 256M。安装IK分词器
访问 ​​https://github.com/medcl/elasticsearch-analysis-ik/releases​​​ 查找与 ElasticSearch 版本对应的分词器,复制其完整下载地址。
SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_Elastic Stack_04
​docker exec -it elasticsearch /bin/sh cd bin/ elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.1/elasticsearch-analysis-ik-7.14.1.zip ​​查看已安装的IK分词器
​elasticsearch-plugin list ​SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_elasticsearch_05
重启 ​​ElasticSearch​​​​docker restart elasticsearch ​​删除分词器
​elasticsearch-plugin remove analysis-ik ​

2. Kibana 部署


  1. 拉取镜像

​Docker Hub 镜像仓库查看 Kibana 最新版本​

​docker pull kibana:7.14.1 ​创建和启动容器
​docker run -d --name kibana --net elk --restart always -p 5601:5601 kibana:7.14.1 ​​访问 ​​http://e.youlai.tech:5601​​​ ,可以看到Kibana界面
SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_数据_06

3. Logstash 部署


  1. 拉取镜像

​Docker Hub 镜像仓库查看 Logstash 最新版本​

​docker pull logstash:7.14.1 ​创建目录
​mkdir -p /opt/logstash/{config,data,pipeline} chmod 777 /opt/logstash/{config,data,pipeline} ​配置文件

  • 设置JVM堆内存大小
    ​vi /opt/logstash/config/jvm.options ​​添加配置信息
    ​-Xmx128m -Xms128m ​
  • Logstash配置
    ​vi /opt/logstash/config/logstash.yml ​​添加配置信息
    ​# 允许通过本机所有IP访问 http.host: "0.0.0.0" # 指定使用管道ID xpack.management.pipeline.id: ["main"] ​
  • 管道ID和配置文件路径映射
    ​vi /opt/logstash/config/pipelines.yml ​​添加管道ID和管道配置文件目录映射,注意符号 - 前后都要有空格(巨坑)
    ​ - pipeline.id: main path.config: "/usr/share/logstash/pipeline" ​SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_elasticsearch_07
  • 管道配置
    添加 ​​有来商城​​ 微服务应用日志管道配置,在上面指定了管道配置容器目录 ​​/usr/share/logstash/pipeline​​ , 后面启动 ​​Logstash​​ 时会将其挂载至宿主机目录 ​​/opt/logstash/pipeline​​,接下来只要在宿主机目录下添加管道配置文件 ​​youlai-log.config​​ 就可以被 ​​Logstash​​ 自动加载生效。
    ​vi /opt/logstash/pipeline/youlai-log.config ​​添加完整内容如下
    ​input { beats { port => 5044 client_inactivity_timeout => 36000 } } filter { mutate { remove_field => ["@version"] remove_field => ["tags"] } } output { if [appname] == "youlai-admin" { elasticsearch { hosts => "http://elasticsearch:9200" index => "youlai-admin-log" } }else if [appname] == "youlai-auth" { elasticsearch { hosts => "http://elasticsearch:9200" index => "youlai-auth-log" } } stdout {} } ​​可以看到在 ​​output​​ 里根据 ​​appname​​ 生成的不同索引库,其中 ​​appname​​ 是 ​​filebeat​​ 自定义字段,目的区分多应用日志,自定义字段在 ​​Filebeat​​部署的时候定义。

创建和启动容器
​docker run -d --name logstash --net elk --restart always \ -p 5044:5044 -p 9600:9600 \ -v /opt/logstash/config:/usr/share/logstash/config \ -v /opt/logstash/data:/usr/share/logstash/data \ -v /opt/logstash/pipeline:/usr/share/logstash/pipeline \ logstash:7.14.1 ​

六. Filebeat 部署


  1. 拉取镜像

​Docker Hub 镜像仓库查看 Filebeat 版本​

​docker pull elastic/filebeat:7.14.1 ​​目录创建
​mkdir -p /opt/filebeat/config chmod 777 /opt/filebeat/config ​​配置文件添加 ​​filebeat.yml​​ 配置文件​​vi /opt/filebeat/config/filebeat.yml ​​添加如下配置:​​filebeat.inputs: - type: log enabled: true paths: - /logs/youlai-admin/log.log fields: appname: youlai-admin # 自定义字段,提供给 Logstash 用于区分日志来源 fields_under_root: true # 开启自定义字段 - type: log enabled: true paths: - /logs/youlai-auth/log.log fields: appname: youlai-auth fields_under_root: true processors: - drop_fields: fields: ["log","input","host","agent","ecs"] # 过滤不需要的字段 output.logstash: hosts: ['47.104.214.213:5044'] ​

  • /logs/youlai-admin/log.log 是应用 ​​youlai-admin​​ 输出的日志文件路径
  • 47.104.214.213 是部署 Logstash 服务器的IP地址

容器创建和启动
​docker run -d --name filebeat --restart=always \ --log-driver json-file \ --log-opt max-size=100m \ --log-opt max-file=2 \ -v /logs:/logs \ -v /opt/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \ elastic/filebeat:7.14.1 ​

七. SpringBoot 应用部署

文章​IDEA 集成 Docker 插件实现一键远程部署 SpringBoot 应用​​​ 中已经详细讲述 ​​youlai-admin​​ 服务是如何部署到线上云环境,接下来补充日志配置。


  • 日志配置
    在 ​​youlai-mall​​ 的日志公共模块 ​​common-log​​ 下的 ​​logback-spring.xml​​ 配置日志输出路径
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_docker_08
    指定生产环境输出至文件
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_docker_09
  • 日志打印
    方便测试,在用户登录成功之后获取用户信息接口打印日志
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_数据_10
  • 日志目录挂载
    在 ​​Run/Debug Configurations​​ 配置 ​​Dockerfile​​ 时在 ​​IDEA 集成 Docker 插件实现一键远程部署 SpringBoot 应用​​ 基础上添加 Docker 容器日志目录 ​​/logs/youlai-admin​​ 挂载至宿主机。
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_数据_11
    目录挂载配置如下, 宿主机 ​​/logs/youlai-admin​​ ←→ 容器 ​​/logs/youlai-admin​​,点击 ​​OK​​ 保存
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_docker_12
  • SpringBoot 应用部署
    选择 Dockerfile 配置然后点击 Run ▶️ 等待应用发布到云服务器
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_docker_13

八. ElasticSerarch 日志查询

等待应用发布完成后,访问 有来商城 线上管理端 www.youlai.tech 登录后查看应用服务器日志文件 ​​/logs/youlai-admin/log.log​​ 查看日志

SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_docker_14

查看 ​​Logstash​​ 处理日志

docker logs logstash

SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_docker_15

访问 ​​http://e.youlai.tech:5601​​​ 进入 ​​Kibana ​​ 控制台,首先添加索引模式,才能进行数据探索(Discover),不过前提是存在数据也就是索引库。


  1. 添加索引模式,Management → Stack Management → Kibana → Index Patterns → Create Index pattern
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_Elastic Stack_16
  2. 输入匹配已存在的索引的规则,点击 ​​Next step​SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_docker_17
  3. 选择时间字段,点击 ​​Create index pattern​SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_Elastic Stack_18
  4. 然后左侧栏点击 ​​Analytics ​​ → ​​Discover​​ 进行数据搜索
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_elasticsearch_19
    SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践_docker_20

九. 总结

本篇完整的讲述使用 ​​Docker​​​ 搭建 ​​ELK​​​ + ​​Filebeat​​​ 环境,通过轻量级日志采集工具 ​​Filebeat​​​ 来收集微服务应用日志,并将日志数据推送给​​Logstash​​​ ,经过 ​​Logstash​​​ 的过滤处理后将数据存入​​ElasticSearch​​​,最终日志数据通过 ​​Kibana​​​呈现。其实​​ELK + Filebeat​​​日志解决方案足够应对大多数的应用场景,但是考虑到 ​​Logstash​​​ 的吞吐量存在瓶颈且收集多个 ​​filebeat​​​ 采集过来的日志并做过滤处理,短时间如果有过多的日志会产生日志堆积和数据丢失,严重消耗服务器的资源,针对此问题目前最常见的解决方案是在 ​​Filebeat​​​ 和 ​​Logstash​​​ 引入消息队列 (Kafka、Redis )进行消峰,让 ​​Logstash​​ 能够稳定匀速的处理日志,引入消息队列在本篇因为时间就没在本篇做说明了,会在后面的文章补充,如需要可以在网上搜索相关资料做整合,相信基于本篇实战基础之上,实现应该不难,希望大家都有所收获。

附录

1. 开源项目

项目名称

码云(Gitee)

Github

微服务后台

youlai-mall

youlai-mall

系统管理前端

youlai-mall-admin

youlai-mall-admin

微信小程序

youlai-mall-weapp

youlai-mall-weapp