【微服务】springboot集成ELK使用详解

目录

一、前言

二、为什么需要ELK

三、ELK介绍

3.1 什么是elk

3.2 elk工作原理

四、ELK环境搭建

4.1 搭建es环境

4.1.1 获取es镜像

4.1.2 启动es容器

2.1.3 配置es参数

2.1.4 重启es容器并访问

4.2 搭建kibana

4.2.1 拉取kibana镜像

4.2.2 启动kibana容器

4.2.3 修改配置文件

4.2.4 重启容器并访问

4.3 搭建logstash

4.3.1 下载安装包

4.3.2 解压安装包

4.3.3 新增配置logstash文件

五、SpringBoot集成ELK

5.1 集成过程

5.1.1 创建springboot工程

5.1.2 导入依赖

5.1.3 配置logback日志

5.1.4 增加测试接口

5.2 效果演示

5.2.1 启动服务工程

5.2.2 配置索引模式

5.2.3 调用接口验证效果

5.3 ELK使用补充

六、写在文末


一、前言

对于一个运行中的应用来说,线上排查问题是一件很头疼的问题。不管是springboot单应用,还是springcloud微服务应用,一旦在生产环境出了问题,大多数人第一反应就是赶紧去看日志查问题。如何查呢?如果是管理不那么严格的项目,允许你登录生产服务器通过命令去查,或者将生产的日志down下来去查。但为了服务器安全,一般来说是不允许研发人员随便接触服务器,会有运维人员去操作日志,这样以来就极大的影响了排查的效率,这时候会有人说,如果有可视化的操作,能可视化检索日志的界面就好了。

二、为什么需要ELK

一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。一个完整的集中式日志系统,需要包含以下几个主要特点:

  • 收集-能够采集多种来源的;
  • 传输-能够稳定的把日志数据传输到中央系统;
  • 存储-如何存储日志数据;
  • 分析-可以支持 UI 分析;
  • 警告-能够提供错误报告,监控机制;

基于上述的需求,业界很多公司在不断探索过程中,经过多年实践经验,最终形成了以ELK为主流的一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前主流的一种日志系统。

三、ELK介绍

3.1 什么是elk

ELK其实并不是某一款软件,而是一套完整的解决方案,是三个产品的首字母缩写,即:

  • Elasticsearch;
  • Logstash ;
  • Kibana;

这三个软件都是开源软件,通常配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为ELK协议栈,具体来说:

Elasticsearch

是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 基于 Lucene 开发,现在是使用最广的开源搜索引擎之一。

Logstash

简单来说就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端,与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供了很多功能强大的滤网以满足你的各种应用场景。

Kibana  

是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看、交互存放在Elasticsearch索引里的数据,使用各种不同的图标、表格、地图等,kibana能够很轻易的展示高级数据分析与可视化。

3.2 elk工作原理

如下是elk实际工作时的原理图,还是很容易理解的

Logstash的存在,让数据可视化的展示成为很多需要做日志类数据展示不可或缺的组件,比如数据源可以是静态的日志文件,也可以是mysql,或来自于kafka的topic消息数据等。

四、ELK环境搭建

下面演示如何搭建elk,网上的参考资料比较丰富,本文采用docker快速搭建起elk的演示环境,参考下面的步骤。

4.1 搭建es环境

4.1.1 获取es镜像

版本可以根据自身的情况选择,我这里使用的是7.6的版本

docker pull elasticsearch:7.6.2

4.1.2 启动es容器

使用下面的命令启动es容器,注意这个配置,ES_JAVA_OPTS="-Xms512m -Xmx512m",这个配置参数值根据你的服务器配置决定,一般最好不要低于512m即可;

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" --name es76 -d elasticsearch:7.6.2

2.1.3 配置es参数

进入到es容器内部,然后找到下面的这个文件

然后将下面的配置参数配置进去

cluster.name: "docker-cluster"
http.cors.enabled: true
network.host: 0.0.0.0
http.port: 9200
http.cors.allow-origin: "*"
2.1.4 重启es容器并访问

配置完成后重启docker容器,重启成功后,开放9200端口,然后浏览器访问,IP:9200,看到如下信息,说明es可以正常使用。

4.2 搭建kibana

4.2.1 拉取kibana镜像

为了减少后面的配置麻烦和一些问题,建议kibana版本与es版本一致

docker pull kibana:7.6.2

4.2.2 启动kibana容器

这里的IP地址,如果是云服务器,注意使用内网的IP地址

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://es服务IP:9200 -p 5601:5601 -d kibana:7.6.2

4.2.3 修改配置文件

进入到kibana容器中,进入到下面的目录中

cd /usr/share/kibana/config
vi kibana.yml 

将如下的配置信息配置进去(es的IP地址如果是云服务器建议使用内网IP)

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://es服务IP:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: zh-CN

4.2.4 重启容器并访问

上述配置信息配置完成后,重启容器,开放5601端口,浏览器就可以直接访问,IP:5601,看到下面的效果说明kibana可以正常使用了

4.3 搭建logstash

4.3.1 下载安装包

logstash的版本建议不要与es版本差别太多即可

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.1.0.tar.gz

4.3.2 解压安装包

tar -zxvf logstash-7.1.0.tar.gz

4.3.3 新增配置logstash文件

进入logstash-7.1.0目录下,创建一个目录,用于保存自定义的配置文件,注意提前开发4560端口

cd cd logstash-7.1.0/

mkdir log-conf

vi logstash.conf

然后添加下面的配置信息

input {tcp {mode => "server"host => "0.0.0.0"port => 4560codec => json}
}
output {elasticsearch {hosts => "es公网地址:9200"index => "springboot-logstash-%{+YYYY.MM.dd}"},stdout { codec => rubydebug }
}

在主目录下,使用下面的命令进行启动

./bin/logstash -f ./log-conf/logstash.conf

看到下面的输出日志,说明当前logstash服务已经开始工作,准备接收输入日志了

五、SpringBoot集成ELK

5.1 集成过程

参考下面的过程在springboot中快速集成elk,如果是dubbo或者springcloud项目,集成步骤也差不多

5.1.1 创建springboot工程

项目目录下

5.1.2 导入依赖

根据需要引入依赖,如果是集成elk,还需要引入下面这个

        <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>5.3</version></dependency>

5.1.3 配置logback日志

springboot集成elk最关键的就是配置logback日志文件,需要按照一定的格式规范进行配置,才能将运行过程中产生的日志上报到logstash,然后经过转换输送到es,最后展现在kibana中,参考下面的配置信息,以下两种配置方式都可以;

方式一:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><springProperty scope="context" name="springApplicationName" source="spring.application.name" /><property name="LOG_HOME" value="logs/service.log" /><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!--接收info日志输出到LogStash--><appender name="LOG_STASH_INFO" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter><destination>logstash地址:4560</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><timestamp><timeZone>Asia/Shanghai</timeZone></timestamp><!--自定义日志输出格式--><pattern><pattern>{"project": "elk","level": "%level","service": "${springApplicationName:-}","pid": "${PID:-}","thread": "%thread","class": "%logger","message": "%message","stack_trace": "%exception"}</pattern></pattern></providers></encoder></appender><root ><appender-ref ref="STDOUT" /><appender-ref ref="LOG_STASH_INFO" /></root></configuration>

方式二:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><!--提取配置文件中的服务名--><springProperty scope="context" name="springApplicationName" source="spring.application.name" /><property name="LOG_HOME" value="logs/service.log" /><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>logstash地址:4560</destination><encoder class="net.logstash.logback.encoder.LogstashEncoder" ><!--定义appname的名字是服务名,多服务时,根据这个进行区分日志--><customFields>{"appname": "${springApplicationName}"}</customFields></encoder></appender><root level="INFO"><appender-ref ref="STDOUT" /><appender-ref ref="logstash" /></root>
</configuration>

5.1.4 增加测试接口

为了后续方便观察效果,增加两个测试接口,一个模拟正常的调用,另一个模拟异常调用

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@Autowiredprivate UserService userService;//http://localhost:8088/user/get?userId=001@GetMapping("/get")public Object getUserInfo(String userId){log.info("getUserInfo userId:【{}】",userId);Map userInfo = userService.getUserInfo(userId);return userInfo;}//http://localhost:8088/user/error?userId=001@GetMapping("/error")public Object error(String userId){log.info("error userId:【{}】",userId);Map userInfo = userService.getUserInfo(userId);int e = 1/0;return userInfo;}
}

5.2 效果演示

5.2.1 启动服务工程

启动之后,通过下面的在logstash终端的输出日志信息中,可以发现logstash已经接收到程序中上报过来的日志了,并且内部已经按照预定的格式进行了转换;

5.2.2 配置索引模式

为了让程序中的日志能够正常展现到es中,由于es是通过接收logstash传输过来的数据,存储到索引中才能通过kibana展现,所以索引的存储格式就很重要,需要提前在kibana上面配置一下索引的展现格式,按照下面的操作步骤配置即可。

在kibana中找到下图模式配置入口

自定义索引的模式,比如这里选择的就是在上面logstash中配置的名称前缀

使用时间戳

刷新配置

最后进入到索引查看的栏目就可以看到展示的索引中的日志信息了

5.2.3 调用接口验证效果

依次调用上面的两个测试接口,然后查看kibana中日志的变化

调用正常响应的接口

接口能够正常响应,由于我们在接口方法中添加了一行输出日志信息,通过上面的搜索框,能够在es的日志信息中搜索出来;

调用异常响应接口

接口调用异常后,也能通过kibana快速发现异常信息输出

通过上面的实验和操作体验,可以感受到在springboot中集成elk之后带来的便利,有了可视化的日志展现,提升问题排查效率的同时,也能更好的统一管理日志,并充分发挥日志的作用。

5.3 ELK使用补充

上面完整演示了如何在springboot中快速接入ELK进行日志的可视化展示,如果使用的是springloud或dubbo等技术栈,集成步骤类似,这里结合实际经验,补充下面几点以供参考。

日志切分与清理

展示的日志毕竟是要存储到ES索引中,随着时间的推移,日志文件将会越来越大,索引也将会占用较大的存储空间,如何管理这些源源不断的日志索引呢,给出下面两点建议:

  • 原始的日志文件,即logback文件建议按天切分(需要在配置文件中配置策略),这样产生的es索引文件也是按天存储;
  • 有了第一步之后,可以通过脚本或者手动的方式定期清理索引;

控制日志输出级别

不建议使用debug级别的日志级别,这样es中存储的日志索引文件会增长的非常快

设置kibana访问密码

生产环境中,日志也是非常重要的数据,在很多公司甚至不会对外开放,而是需要通过授权后才能查看,因此如果是在你的生产环境集成ELK,建议设置kibana的访问账户信息。

六、写在文末

本文详细介绍了如何在springboot中快速接入ELK的过程,ELK可以说在实际项目中具有很好的适用价值,不管是小项目,还是中大型项目,都具备普适参考性,值得深入了解和学习。本篇到此结束,感谢观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 建议大家按以下顺序看 前端自动化&#xff08;其一&#xff09;部署gitlab https://blog.csdn.net/weixin_45062076…

【Redis】Redis集群方案应该怎么做 都有哪些方案

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Redis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 &#xff08;1&#xff09;twemproxy &#xff08;2&#xff09;codis &#xff08;3&#xff09;redis cluster3.0自带的集群 …

爬虫基础-前端基础

Html是骨骼、css是皮肤、js是肌肉&#xff0c;三者之间的关系可以简单理解为m(html)-v(css)-c(js) 浏览器的加载过程 构建dom树 子资源加载-加载外部的css、图片、js等外部资源 样式渲染-css执行 DOM树 ajax、json、xml AJAX 是一种在无需重新加载整个网页的情况下&#xf…

iOS_Xcode_LLDB调试常用命令

文章目录 结构常用命令&#xff1a;1、流程控制&#xff1a;2、常用命令3、进程信息&#xff1a;4、寄存器&#xff1a;register5、镜像&#xff1a;image6、内存&#xff1a;memory7、符号断点&#xff1a;breakpoint8、内存断点&#xff1a;watchpoint9、Tips&#xff1a; 结…

MySQL 学习记录

基本常识 row-size-limitsblob&#xff1a; BLOB and TEXT columns cannot have DEFAULT values.Instances of BLOB or TEXT columns in the result of a query that is processed using a temporary table causes the server to use a table on disk rather than in memory b…

Linux命令-apt-get命令(Debian Linux发行版中的APT软件包管理工具)

补充说明 apt-get命令 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个 包管理系统。deb包可以把一个应用的文件包在一起&#xff0c;大体就如同Windows上的安装文件。 语法 apt-get [OPTION] PACKAGE选项 apt-get install 安装新包 apt-get r…

【vue】图片加载骨架

一、前言 在网速较低或者网站的服务器宽带只有几MB的情况下&#xff0c;网页中的图片加载时&#xff0c;要么空白&#xff0c;要么像打印机一样一行一行地“扫描”出来&#xff0c;为了提升用户体验&#xff0c;可以给图片标签外加一层骨架。 无骨架 有骨架 二、详细设计 每张…

MySQL之索引分类,语法以及SQL性能分析(慢日志,profile,explain)

索引分类 分类含义特定关键字主键索引针对于表中主键创建的索引默认自动创建&#xff0c;只能有一个PRIMARY唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE常规索引快速定位特定数据可以有多个全文索引全文索引查找的文本中的关键字&#xff0c;而不是比较索引中的…

Asp.net Core Mvc 7.0 Web 控制器接收Get/Post表单参数

记得.Net 5之前都是直接用 Request.Form 非常方便&#xff0c;但似乎6.0以后就不能这样用了。 1、接受post表单&#xff0c;使用 IFormCollection public IActionResult Login(IFormCollection pms){ViewData["name"] pms["login-username"]; ViewData[&…

如何在 VM 虚拟机中安装 Deft(数字证据及取证工具箱) 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 先得安装 VM 虚拟机&#xff0c;没有的可以参考这篇文章安装 VM 虚拟机 如何在 VM 虚拟机中安装 Win10 操作系统保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135713915 二、Deft 镜像 下载…

Open CASCADE学习| ​提取曲面的PCurve

PCurve这个概念&#xff0c;字面上来理解就是参数曲线&#xff08;Parametric Curve&#xff09;。参数空间曲线是在参数曲面的双参数空间中的二维样条曲线。 二维曲线定义的目的只有一个&#xff1a;pCurve&#xff0c;参数曲线。OCC采用参数法构建几何结构&#xff0c;所有的…

【缓存周总结】Redis缓存的使用以及数据安全的处理

前言 Redis非关系型数据库已经是很常见的工具了&#xff0c;项目中用到的也很多&#xff0c;这篇文章系统的分析下使用过程中可能会遇到的问题 一、缓存 缓存是数据交换的缓冲区&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 我们项目中引用的Redis目的就是…

【前端web入门第二天】02 表单-input标签-单选框-多选框

表单 文章目录: 1.input标签基本使用 1.1 input标签占位文本1.2 单选框 radio 1.3 多选框 checkbox 作用:收集用户信息。 使用场景: 登录页面注册页面搜索区域 1.input标签基本使用 input标签type属性值不同&#xff0c;则功能不同。 <input type"..."&g…

Android Okhttp断点续传

什么是断点续传 指的是在上传/下载时&#xff0c;将任务&#xff08;一个文件或压缩包&#xff09;人为的划分为几个部分&#xff0c;每一个部分采用一个线程进行上传/下载&#xff0c;如果碰到网络故障&#xff0c;可以从已经上传/下载的部分开始继续上传/下载未完成的部分&a…

RabbitMQ面试

1. 什么是RabbitMQ RabbitMQ是使用Erlang语言开发的&#xff0c;基于AMQP高级消息队列的开源消息中间件 Erlang语言主要用于开发并发和分布式系统&#xff0c;在电信领域得到广泛应用 2.什么是消息中间件 消息中间件是在分布式系统中传递消息的软件服务。它允许不同的系统组件…

机器学习 | 如何使用 Seaborn 提升数据分析效率

Seaborn和Matplotlib都是Python可视化库&#xff0c;它们都可以用于创建各种类型的图表。但是&#xff0c;Seaborn 和Matplotlib在概念和设计上有一些不同。 Matplotlib虽然已经是比较优秀的绘图库了&#xff0c;但是它有个今人头疼的问题&#xff0c;那就是API使用过于复杂&am…

面试经典 150 题 ---- 移除元素

面试经典 150 题 ---- 移除元素 移除元素方法一&#xff1a;双指针方法二&#xff1a;双指针优化 移除元素 方法一&#xff1a;双指针 题目要求在原数组的基础进行元素的删除&#xff0c;所以输出的数组长度一定小于原数组的长度&#xff0c;因此可以使用双指针&#xff0c;r…

CMMI、SPCA、CSMM,三种认证的差异有哪些?

在当今的企业环境中&#xff0c;体系认证已经成为了一个重要的议题。其中&#xff0c;CMMI、SPCA和CSMM是三种广泛使用的认证&#xff0c;它们在各自领域内具有特定的目标和要求&#xff0c;今天擎标就带大家了解一下这三种认证之间的差异。 CMMI、CSMM和SPCA分别是什么 1、C…

htb Pov wp简记

最近懒得飞起 不想写太细&#xff0c;有师傅想看完整的可以留个言或者私信 我再补补… user部分 nmap只扫到一个端口 http/80 目录没扫出什么 vhost扫出dev来 在抓包访问页面邮箱丢出去的包有包含asp.net的viewstate&#xff0c;这里一开始我还没在意&#xff0c;后来发现有个…

【YOLO系列算法俯视视角下舰船目标检测】

YOLO系列算法俯视视角下舰船目标检测 数据集和模型YOLO系列算法俯视视角下舰船目标检测YOLO系列算法俯视视角下舰船目标检测可视化结果 数据集和模型 数据和模型下载&#xff1a; YOLOv6俯视视角下舰船目标检测训练好的舰船目标检测模型舰船目标检测数据YOLOv7俯视视角下舰船…