Spring Boot版本:2.3.4.RELEASE
目录
- 最基本的日志功能及自定义日志
- 日志链路追踪
- EFK日志收集系统
- 用Golang手撸一个轻量级日志收集工具
最基本的日志功能及自定义日志
添加logback依赖:
1 | xml复制代码<dependency> |
在application配置文件中设置日志保存路径:
1 | yml复制代码server: |
关于logback的配置文件
logback-spring.xml:
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
logback-spring-file.level.xml:
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
配置文件里的注释比较详细,可以根据需要自行修改,配置里有一个“traceId”,这不是logback自带的,是我为了实现日志追踪而添加的,后面会说到。
写接口来测试一下:
1 | java复制代码package com.cc.controller; |
启动项目,分别执行测试接口,然后我们就可以在_logs文件夹内看到4个日志文件,分别是记录启动信息的INFO日志、记录警告的WARN日志、记录错误的ERROR日志以及自定义的MYLOGGER日志。
日志链路追踪
我们给HTTP请求赋予一个traceId,这个traceId将贯穿整个请求,请求过程中所有的日志都会记录traceId,由此达到快速定位问题和过滤无关日志的效果。
为了好看些,我们定义一个常量类:
1 | java复制代码package com.cc.config.logback; |
然后是logback过滤器:
1 | java复制代码package com.cc.config.logback; |
我们用处理后的UUID作为traceId,现在再调用测试接口,可以看到日志中附带的traceId。
EFK日志收集系统
EFK是指Elasticsearch、Filebeat、和Kibana,原本还有个logstash,但是logstash的使用没有filebeat简单,并且它的内容过滤功能并不是刚需,所以就不加上了,但是后面仍然会附带logstash的简要介绍。
先说明一下EKF的工作流程
- Spring Boot应用的日志会保存在指定的路径
- filbeat会检测到日志文件的变化,并将内容发送到elasticsearch
- 如果使用logstash,则会将内容发送到logstash
- logstash将内容进行过滤分析以及格式转换等操作,再发送给elasticsearch,这种处理会使日志数据在kibana上显示的更加详细。
- 访问kibana可视化界面,在kibana中操作或查看elasticseach的保存的日志数据
环境准备
因为我的EFK环境是搭建在虚拟机的docker上,本机是Windows,所以为了让docker上的filebeat容器能检测到我的日志文件变化,我有两种方案:
- 将项目部署成jar包在虚拟机的Linux上运行,并将日志保存路径设置到指定位置
- 本机和虚拟机建立共享文件夹
因为VMWare建立共享文件夹十分简单,并且我也能在本地开发环境实时更新代码,所以选择了方案1。
容器创建
这里假设读者对docker有一定的了解,毕竟关于docker的介绍篇幅不小,而且也与主题无关,就不在这里细说了。
1 | bash复制代码# 创建一个网络,用于容器间的通讯 |
上面filebeat的容器文件映射路径要注意,映射到了我的共享文件夹,所以不一定和大家一样,按需修改即可。
并且为了方便,我们直接映射了一个filebeat.yml配置文件到filebeat容器内,省的后面再进去修改了。
filebeat.yml:
1 | yml复制代码filebeat.inputs: |
配置文件说明:
1 | yml复制代码filebeat.inputs: // 输入源 |
让kibana连接到elasticsearch
进入kibana容器中,修改配置文件并重启:
docker exec -it mykibana bash
cd config/
vi kibana.yml
原内容:
1 | yml复制代码server.name: kibana |
修改成:
1 | yml复制代码server.name: kibana |
可以看出,如果es的容器名就是elasticsearch的话,就可以不用改。
测试容器有效性
elasticsearch:访问 http://ip:9200 ,有json内容出现则成功
kibana:访问 http://ip:5601 ,没有报错,出现可视化UI界面则成功,如果失败,基本是连接问题,请确认配置文件内连接elasticsearch的内容是否正确,确认容器间是否在同一个网段可以进行通讯,调试时可以在容器内互相ping进行确认。
filebeat:等会进kibana可视化界面就能知道
测试效果
调用接口 localhost:8888/w,或者是e/m接口,以输出日志内容到指定位置。此时filebeat已经能检测到文件内容变更并推送到elasticsearch
- 在指定的目录可以看到输出的日志文件,则说明日志文件保存成功。
- 打开kibana可视化面板:IP:5061,点击左上角的三横线图标,显示菜单,找到Analytics-Discover,第一次进需要创建Index Patterns,因为我们在filebeat.yml中设置的索引是filebeat,所以这里也要用上,填写了filebeat之后可以看到有匹配项,下一步,步骤2选择时间过滤器,然后确定即可。此时已经可以看到logback->filebeat->elasticsearch的日志内容,然后借助kibana面板就能方便的进行数据检索了。
至此,EFK入门级部署完成。
用Golang手撸一个轻量级日志收集工具
EFK使用方便,界面美观,并且还支持分布式,可以说十分好用了,但是因为我的服务器内存没有那么充裕,用EFK的话要消耗接近1G,所以我选择了另一种方案:用Golang写一个服务,结合Linux的grep指令,从日志文件中提取匹配的内容。这种方案好处是用Golang写,内存占用很低,缺点是搜索效率低,但是对于我的小项目来说正合适。
附上Golang的代码,其实原理很简单,就是使用Gin框架启动一个Web服务,然后调用shell脚本提取内容:
1 | go复制代码package main |
findLog.sh:
1 | sh复制代码cd /Users/chen/Desktop/mycontainers/mall-business/data/logs |
将这个Golang应用打包到指定平台运行即可。
本文转载自: 掘金