需求
需要将后台产生的日志试试通过WebSocket发送,在前端建立连接后可实时查看当前系统产生的日志
思路
先进行一番搜索看看有没有现成的轮子
看到一篇博客与我的想法接近,但是他使用的是Logback
cloud.tencent.com/developer/a…
在Log4j2的官方文档中给出了不同场景下各个日志框架的性能区别logging.apache.org/log4j/2.x/p…
秉持能用好的用好的能用快的用快的的观念,我选择Log4j2
对于这个问题我有两个思路
- 将日志文件写到文件中,监控文件变化,变化时,读取一行交给WebSocket发送
- 实现一个Appender直接将日志交给WebSocket
总感觉第一种方法不太优雅,需要指定配置文件所在的地址
这里详细说一下第二种方法
步骤
引入Log4j2依赖
spring-boot-starter
包下有一个spring-boot-starter-logging
内包含了Logback相关的依赖,需要将其排除
再引入依赖
引入WebSocket依赖
什么是WebSocket,WebSocket怎么用等等一系列问题可以看www.mydlq.club/article/86/
写的非常好,非常全面
Spring Boot支持使用 STOMP,我们这里也使用的是STOMP,关于STOMP上面的博客也有提到。
配置WebSocket
新建一个WebSocketConfig类用来配置WebSocket的基本信息
1 | less复制代码@Configuration |
到此WebSocket配置完毕
实现一个WebSocketAppender将日志记录到WebSocket
如何自己实现appender可以看
logging.apache.org/log4j/2.x/m…
logging.apache.org/log4j/2.x/m…
官网的两节内容
也可以搜索关键字”Log4j2 插件“进行学习
为什么要自己实现是因为Log4j2本身提供的appender都没有契合这个需求的(貌似)
appender实现
这里直接给我我的实现
1 | java复制代码@Plugin(name = "WebSocketAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true) |
我append的方法不够完善,并没有考虑到并发的情况,可能出现许多问题
阻塞队列的实现
1 | java复制代码public class LoggerQueue { |
日志转发实现
创建一个LogForward用以将队列中的方法转发到WebSocket中
1 | java复制代码@Component |
Log4j2.xml配置
这里给我我的配置
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
这里有个很坑的点就是
在DEBUG级别下WebSocket发消息会产生一条日志,这条日志又会导致发消息,就形成了循环
这里用了一个StringMatchFilter通过匹配字符串来过滤那两条日志,但这样不优雅,也不完美,但暂时想不到别的办法
至此,后端部分全部完成
搭建前端测试
这里直接复制了Spring官方文档的代码稍作修改
index.html
1 | html复制代码<!DOCTYPE html> |
app.js
1 | javascript复制代码var stompClient = null; |
main.css
1 | css复制代码body { |
讲这三个文件保存到resource/static下即可
测试
点击Connect建立连接,就可以看到日志输出
本文转载自: 掘金