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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
容器镜像服务 ACR,镜像仓库100个 不限时长
日志服务 SLS,月写入数据量 50GB 1个月
简介: SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践

一. 前言

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

微信图片_20230710081138.png



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

1

查看已有网络


docker network ls

1

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

微信图片_20230710081143.png



Docker 自定义网络模式


删除已有网络


docker network rm elk

1

五. ELK 部署

1. ElasticSerach 部署

创建目录


mkdir -p /opt/elasticsearch/{config,data}

chmod 777 /opt/elasticsearch/{config,data}

1

2

拉取镜像


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


docker pull elasticsearch:7.14.1

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 版本对应的分词器,复制其完整下载地址。

微信图片_20230710081208.png



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

1

2

3

查看已安装的IK分词器


elasticsearch-plugin list

1


重启 ElasticSearch


docker restart elasticsearch

1

删除分词器


elasticsearch-plugin remove analysis-ik

1

2. Kibana 部署

拉取镜像


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


docker pull kibana:7.14.1

1

创建和启动容器


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

1

访问 http://e.youlai.tech:5601 ,可以看到Kibana界面

微信图片_20230710081234.png



3. Logstash 部署

拉取镜像


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


docker pull logstash:7.14.1

1

创建目录


mkdir -p /opt/logstash/{config,data,pipeline}

chmod 777 /opt/logstash/{config,data,pipeline}


配置文件


设置JVM堆内存大小


vi /opt/logstash/config/jvm.options

1

添加配置信息


-Xmx128m

-Xms128m

1

2

Logstash配置


vi /opt/logstash/config/logstash.yml

1

添加配置信息


# 允许通过本机所有IP访问

http.host: "0.0.0.0"

# 指定使用管道ID

xpack.management.pipeline.id: ["main"]


管道ID和配置文件路径映射


vi /opt/logstash/config/pipelines.yml

1

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


- pipeline.id: main

  path.config: "/usr/share/logstash/pipeline"

1

2

微信图片_20230710081240.png


管道配置


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


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

1

添加完整内容如下


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 部署

拉取镜像


Docker Hub 镜像仓库查看 Filebeat 版本


docker pull elastic/filebeat:7.14.1

1

目录创建


mkdir -p /opt/filebeat/config

chmod 777 /opt/filebeat/config

1

2

配置文件


添加 filebeat.yml 配置文件


vi /opt/filebeat/config/filebeat.yml

1

添加如下配置:


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.204:5044']


/logs/youlai-admin/log.log 是应用 youlai-admin 输出的日志文件路径

47.104.214.204 是部署 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 配置日志输出路径


微信图片_20230710081305.png


指定生产环境输出至文件

微信图片_20230710081309.png



日志打印


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

微信图片_20230710081312.png



日志目录挂载


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

微信图片_20230710081314.png



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

微信图片_20230710081317.png



SpringBoot 应用部署


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

微信图片_20230710081321.png



八. ElasticSerarch 日志查询

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


微信图片_20230710081412.png

查看 Logstash 处理日志


docker logs logstash

1

微信图片_20230710081416.png


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


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

微信图片_20230710081437.png



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


微信图片_20230710081439.png


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

微信图片_20230710081442.png



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


微信图片_20230710081445.png


微信图片_20230710081448.png


九. 总结

本篇完整的讲述使用 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


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
20 5
|
6天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
4天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
6天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
7天前
|
监控 API 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势、面临的挑战以及最佳实践策略。不同于传统的单体应用,微服务通过细粒度的服务划分促进了系统的可维护性、可扩展性和敏捷性。文章首先概述了微服务的核心概念及其与传统架构的区别,随后详细阐述了构建微服务时需考虑的关键技术要素,如服务发现、API网关、容器化部署及持续集成/持续部署(CI/CD)流程。此外,还讨论了微服务实施过程中常见的问题,如服务间通信复杂度增加、数据一致性保障等,并提供了相应的解决方案和优化建议。总之,本文旨在为开发者提供一份关于如何在现代后端系统中有效采用和优化微服务架构的实用指南。 ####
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
3月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
108 2
基于Redis的高可用分布式锁——RedLock
|
3月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
7天前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
40 16
|
1月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
57 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁