一. 前言

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

二. 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

    1. docker network create elk
  • 查看已有网络

    1. docker network ls

    Docker自带3种网络模式 bridge、host、none

    Docker 自定义网络模式

  • 删除已有网络

    1. docker network rm elk

五. ELK 部署

1. Elastic Serach 部署

  1. 创建目录

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

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

    1. docker pull elasticsearch:7.14.1
  3. 配置文件

    创建配置文件elasticsearch.yml

    1. vi /opt/elasticsearch/config/elasticsearch.yml

    添加配置信息

    1. # 允许通过本机所有IP访问
    2. http.host: 0.0.0.0
    3. # 是否支持跨域,默认为false
    4. http.cors.enabled: true
    5. http.cors.allow-origin: "*"
  4. 创建和启动容器

    1. docker run -d --name elasticsearch --net elk --restart always \
    2. -p 9200:9200 -p 9300:9300 \
    3. -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
    4. -e "discovery.type=single-node" \
    5. -v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
    6. -v /opt/elasticsearch/data:/usr/share/elasticsearch/data \
    7. elasticsearch:7.14.1

    JVM堆内存大小设置 128M 时,安装 IK 分词器的时候会报错,建议堆内存设置至少 256M。

  5. 安装IK分词器

    访问 https://github.com/medcl/elasticsearch-analysis-ik/releases 查找与 ElasticSearch 版本对应的分词器,复制其完整下载地址。

    1. docker exec -it elasticsearch /bin/sh
    2. cd bin/
    3. elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.1/elasticsearch-analysis-ik-7.14.1.zip

    查看已安装的IK分词器

    1. elasticsearch-plugin list

    重启 ElasticSearch

    1. docker restart elasticsearch

    删除分词器

    1. elasticsearch-plugin remove analysis-ik

2. Kibana 安装

  1. 拉取镜像

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

    1. docker pull kibana:7.14.1
  2. 创建和启动容器

    1. docker run -d --name kibana --net elk --restart always -p 5601:5601 kibana:7.14.1

    访问 www.youlai.tech:5601 ,可以看到Kibana界面

3. LogStash 安装

  1. 拉取镜像

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

    1. docker pull logstash:7.14.1
  2. 创建目录

    1. mkdir -p /opt/logstash/{config,data,pipeline}
    2. chmod 777 /opt/logstash/{config,data,pipeline}
  3. 配置文件

    • 设置JVM堆内存大小

      1. vi /opt/logstash/config/jvm.options

      添加配置信息

      1. -Xmx128m
      2. -Xms128m
    • Logstash配置

      1. vi /opt/logstash/config/logstash.yml

      添加配置信息

      1. # 允许通过本机所有IP访问
      2. http.host: "0.0.0.0"
      3. # 指定使用管道ID
      4. xpack.management.pipeline.id: ["main"]
    • 管道ID和配置文件路径映射

      1. vi /opt/logstash/config/pipelines.yml

      添加管道ID和管道配置文件目录映射,注意符号 - 前后都要有空格(巨坑)

      1. - pipeline.id: main
      2. path.config: "/usr/share/logstash/pipeline"

    • 管道配置

      添加 有来商城 微服务应用日志管道配置,在上面指定了管道配置容器目录 /usr/share/logstash/pipeline , 后面启动 Logstash 时会将其挂载至宿主机目录 /opt/logstash/pipeline,接下来只要在宿主机目录下添加管道配置文件 youlai-log.config 就可以被 Logstash 自动加载生效。

      1. vi /opt/logstash/pipeline/youlai-log.config

      添加完整内容如下

      1. input {
      2. beats {
      3. port => 5044
      4. client_inactivity_timeout => 36000
      5. }
      6. }
      7. filter {
      8. mutate {
      9. remove_field => ["@version"]
      10. remove_field => ["tags"]
      11. }
      12. }
      13. output {
      14. if [appname] == "youlai-admin" {
      15. elasticsearch {
      16. hosts => "http://elasticsearch:9200"
      17. index => "youlai-admin-log"
      18. }
      19. }else if [appname] == "youlai-auth" {
      20. elasticsearch {
      21. hosts => "http://elasticsearch:9200"
      22. index => "youlai-auth-log"
      23. }
      24. }
      25. stdout {}
      26. }

      可以看到在 output 里根据 appname 生成的不同索引库,其中 appnamefilebeat 自定义字段,目的区分多应用日志,自定义字段在 Filebeat部署的时候定义。

  4. 创建和启动容器

    1. docker run -d --name logstash --net elk --restart always \
    2. -p 5044:5044 -p 9600:9600 \
    3. -v /opt/logstash/config:/usr/share/logstash/config \
    4. -v /opt/logstash/data:/usr/share/logstash/data \
    5. -v /opt/logstash/pipeline:/usr/share/logstash/pipeline \
    6. logstash:7.14.1

六. Filebeat 部署

  1. 拉取镜像

    Docker Hub 镜像仓库查看 Filebeat 版本

    1. docker pull elastic/filebeat:7.14.1
  2. 目录创建

    1. mkdir -p /opt/filebeat/config
    2. chmod 777 /opt/filebeat/config
  3. 配置文件

    添加 filebeat.yml 配置文件

    1. vi /opt/filebeat/config/filebeat.yml

    添加如下配置:

    1. filebeat.inputs:
    2. - type: log
    3. enabled: true
    4. paths:
    5. - /logs/youlai-admin/log.log
    6. fields:
    7. appname: youlai-admin # 自定义字段,提供给 Logstash 用于区分日志来源
    8. fields_under_root: true # 开启自定义字段
    9. - type: log
    10. enabled: true
    11. paths:
    12. - /logs/youlai-auth/log.log
    13. fields:
    14. appname: youlai-auth
    15. fields_under_root: true
    16. processors:
    17. - drop_fields:
    18. fields: ["log","input","host","agent","ecs"] # 过滤不需要的字段
    19. output.logstash:
    20. hosts: ['47.104.214.204:5044']
    • /logs/youlai-admin/log.log 是应用 youlai-admin 输出的日志文件路径
    • 47.104.214.204 是部署 Logstash 服务器的IP地址
  4. 容器创建和启动

    1. docker run -d --name filebeat --restart=always \
    2. --log-driver json-file \
    3. --log-opt max-size=100m \
    4. --log-opt max-file=2 \
    5. -v /logs:/logs \
    6. -v /opt/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \
    7. elastic/filebeat:7.14.1

七. SpringBoot 应用部署和日志配置

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

  • 日志配置

    youlai-mall 的日志公共模块 common-log 下的 logback-spring.xml 配置日志输出路径

    指定生产环境输出至文件

  • 日志打印

    方便测试,在用户登录成功之后获取用户信息接口打印日志

  • 日志目录挂载

    Run/Debug Configurations 配置 Dockerfile 时在 IDEA 集成 Docker 插件实现一键远程部署 SpringBoot 应用 基础上添加 Docker 容器日志目录 /var/log/youlai-admin 挂载至宿主机。

    目录挂载配置如下, 宿主机 /var/log/youlai-admin ←→ 容器 /var/log/youlai-admin,点击 OK 保存

  • SpringBoot 应用部署

    选择 Dockerfile 配置然后点击 Run ️ 等待应用发布到云服务器

八. ElasticSerarch 日志查询

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

查看 Logstash 处理日志

  1. docker logs logstash

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

  1. 添加索引模式,Management → Stack Management → Kibana → Index Patterns → Create Index pattern

  2. 输入匹配已存在的索引的规则,点击 Next step

  3. 选择时间字段,点击 Create index pattern

  4. 然后左侧栏点击 Analytics Discover 进行数据搜索

九. 总结

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

附录

1. 开源项目

项目名称 码云(Gitee) Github
微服务后台 youlai-mall youlai-mall
系统管理前端 youlai-mall-admin youlai-mall-admin
微信小程序 youlai-mall-weapp youlai-mall-weapp

2. 联系信息

微信交流群只能通过邀请方式进入,如果项目中遇到什么问题或者想进入交流群学习的朋友请添加开发人员后由其拉进群,备注“有来”即可。

【有来小店】微信小程序体验码 进群加我,备注“有来”即可

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

  1. IDEA 集成 Docker 插件实现一键远程部署 SpringBoot 应用,无需三方依赖,开源微服务全栈项目有来商城云环境的部署方式

    一. 前言 最近有些童鞋对开源微服务商城项目 youlai-mall 如何部署到线上环境以及项目中 的Dockerfile 文件有疑问,所以写了这篇文章做个答疑以及演示完整的微服务项目发布到线上的流程 ...

  2. AgileBoot - 手把手一步一步带你Run起全栈项目(SpringBoot+Vue3)

    AgileBoot是笔者在业余时间基于ruoyi改造优化的前后端全栈项目. 关于AgileBoot的详细介绍:https://www.cnblogs.com/valarchie/p/16777336. ...

  3. SpringBoot整合ElasticSearch实现多版本的兼容

    前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...

  4. SpringBoot整合Flyway(数据库版本迁移工具)

    简介 在团队开发当中,有可能每个人都是使用自己本地的数据库.当数据库的表或者字段更新时,往往需要告知团队的其他同事进行更新. Flyway数据库版本迁移工具,目的就是解决该问题而诞生的(我自己想的). ...

  5. SpringBoot微服务电商项目开发实战 --- 模块版本号统一管理及Redis集成实现

    上一篇文章总结了基于SpringBoot实现分布式微服务下的统一配置.分环境部署配置.以及服务端模块的分离(每一个提供者就是一个独立的微服务).微服务落地.Dubbo整合及提供者.消费者的配置实现.本 ...

  6. SpringBoot微服务电商项目开发实战 --- Redis缓存雪崩、缓存穿透、缓存击穿防范

    最近已经推出了好几篇SpringBoot+Dubbo+Redis+Kafka实现电商的文章,今天再次回到分布式微服务项目中来,在开始写今天的系列五文章之前,我先回顾下前面的内容. 系列(一):主要说了 ...

  7. springboot整合dubbo+zookeeper最新详细

    引入 最近和小伙伴做一个比赛,处于开发阶段,因为涉及的服务比较多,且服务需要分开部署在不同的服务器上,讨论之后,打算采用分布式来做,之前学习springboot的时候,部分章节涉及到了springbo ...

  8. Springboot整合MongoDB(Eclipse版本)

    IDEA版本其实也差不多的,大同小异 简单Demo地址: https://blog.csdn.net/shirukai/article/details/82152243 Springboot项目整合M ...

  9. SpringBoot微服务电商项目开发实战 --- Kafka集成接入

    kafka作为消息中间件的一款产品,她比较轻量级,在吞吐量方面很优秀,默认消息持久化到硬盘当中 168小时=7天,log.retention.hours=168,比较适合来做运营的统计.其他的不多讲, ...

随机推荐

  1. XML外部实体注入 安鸾 Writeup

    XML外部实体注入01 XML外部实体注入,简称XXE 网站URL:http://www.whalwl.host:8016/ 提示:flag文件在服务器根目录下,文件名为flag XML用于标记电子文 ...

  2. VLAN-1 基础配置及access接口

    一.实验拓扑图 二.实验编制 三.实验步骤 1.给对应的PC设置对应的IP和掩码还有接口,以及根据需要划分不同的vlan区域,再用文本标记出不同部门. 2.启动设备(全选) 3.首先用ping命令检查 ...

  3. miniFTP项目实战一

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  4. SQL 练习26

    查询 1990 年出生的学生名单 --方式1 SELECT * FROM Student WHERE Sage BETWEEN '1990-01-01' AND '1990-12-31' --方式2 ...

  5. SQL 练习17

    查询各科成绩最高分.最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 , 及格为>=60,中等为:70-80,优良为:80-9 ...

  6. NOIP 模拟 $30\; \rm 毛二琛$

    题解 \(by\;zj\varphi\) 原题问的就是对于一个序列,其中有的数之间有大小关系限制,问有多少种方案. 设 \(dp_{i,j}\) 表示在前 \(i\) 个数中,第 \(i\) 个的排名 ...

  7. qt work

    auto folder1="./.mm"; QDir *folder = new QDir; bool exist = folder->exists(folder1); if ...

  8. ASP.NET Core教程:ASP.NET Core使用AutoMapper

    一.前言 在实际的项目开发过程中,我们使用各种ORM框架可以使我们快捷的获取到数据,并且可以将获取到的数据绑定到对应的List<T>中,然后页面或者接口直接显示List<T>中 ...

  9. C#多线程---Semaphore实现线程同步

    一.简介 Semaphore类限制可同时访问某一资源或资源池的线程数.线程通过调用 WaitOne方法将信号量减1,并通过调用 Release方法把信号量加1. 构造函数:public Semapho ...

  10. final 关键字,你想知道的都在这里

    哈喽,大家好,我是指北君. 介绍完 native.static 关键字后,指北君马不停蹄,接着为大家介绍另一个常用的关键字--final. 对于Java中的 final 关键字,我们首先可以从字面意思 ...