From 3334aa23d9ffe3bc7ce3b8835235ed154b4b3d78 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=B4=AB=E5=BD=B1233?= <1440196015@qq.com>
Date: Fri, 18 Jul 2025 11:18:45 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 6 ++
.../cn/somkit/fmt/entity/LoggerMessage.java | 51 +++++++++++++++--
.../cn/somkit/fmt/filter/LogStashFilter.java | 22 ++++---
.../fmt/socket/WebSocketAutoConfig.java | 23 ++++++++
.../fmt/socket/WebSocketServerHandler.java | 57 +++++++++++++++++++
...onContextProvider.java => AppContext.java} | 2 +-
.../java/cn/somkit/fmt/utils/LoggerQueue.java | 2 +-
src/main/resources/logback-spring.xml | 4 +-
src/main/resources/templates/logging.html | 34 ++++++++++-
9 files changed, 176 insertions(+), 25 deletions(-)
create mode 100644 src/main/java/cn/somkit/fmt/socket/WebSocketAutoConfig.java
create mode 100644 src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java
rename src/main/java/cn/somkit/fmt/utils/{ApplicationContextProvider.java => AppContext.java} (90%)
diff --git a/pom.xml b/pom.xml
index 17811bb..310d199 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,11 +29,17 @@
org.springframework.boot
spring-boot-starter-web
+
org.springframework.boot
spring-boot-starter-thymeleaf
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
cn.hutool
hutool-json
diff --git a/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java b/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java
index 778a21e..a25c154 100644
--- a/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java
+++ b/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java
@@ -2,9 +2,48 @@ package cn.somkit.fmt.entity;
import java.time.LocalDateTime;
-public record LoggerMessage(
- String level,
- String loggerName,
- String message,
- LocalDateTime timestamp
-) {}
+public class LoggerMessage {
+ String level;
+ String loggerName;
+ String message;
+ String timestamp;
+
+ public LoggerMessage(String level, String loggerName, String message, String timestamp) {
+ this.level = level;
+ this.loggerName = loggerName;
+ this.message = message;
+ this.timestamp = timestamp;
+ }
+
+ public String getLevel() {
+ return level;
+ }
+
+ public void setLevel(String level) {
+ this.level = level;
+ }
+
+ public String getLoggerName() {
+ return loggerName;
+ }
+
+ public void setLoggerName(String loggerName) {
+ this.loggerName = loggerName;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(String timestamp) {
+ this.timestamp = timestamp;
+ }
+}
diff --git a/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java b/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java
index 5bc65e2..2c28cac 100644
--- a/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java
+++ b/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java
@@ -4,6 +4,7 @@ import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
+import cn.hutool.core.date.DateUtil;
import cn.somkit.fmt.entity.LoggerMessage;
import cn.somkit.fmt.utils.LoggerQueue;
@@ -19,18 +20,15 @@ public class LogStashFilter extends Filter {
@Override
public FilterReply decide(ILoggingEvent e) {
- if (!this.isStarted()) {
- return FilterReply.NEUTRAL;
- } else {
- LoggerMessage msg = new LoggerMessage(
- e.getLevel().toString(),
- e.getLoggerName(),
- e.getFormattedMessage(),
- Instant.ofEpochMilli(e.getTimeStamp()).atZone(ZoneId.systemDefault()).toLocalDateTime()
- );
- LoggerQueue.getInstance().push(msg); // 单例阻塞队列
- return e.getLevel().isGreaterOrEqual(this.level) ? FilterReply.NEUTRAL : FilterReply.DENY;
- }
+ LoggerMessage msg = new LoggerMessage(
+ e.getLevel().toString(),
+ e.getLoggerName(),
+ e.getFormattedMessage(),
+ DateUtil.format(Instant.ofEpochMilli(e.getTimeStamp()).atZone(ZoneId.systemDefault()).toLocalDateTime(),
+ "yyyy-MM-dd HH:mm:ss.SSS")
+ );
+ LoggerQueue.getInstance().push(msg); // 单例阻塞队列
+ return FilterReply.NEUTRAL;
}
public void setLevel(String level) {
diff --git a/src/main/java/cn/somkit/fmt/socket/WebSocketAutoConfig.java b/src/main/java/cn/somkit/fmt/socket/WebSocketAutoConfig.java
new file mode 100644
index 0000000..ea7c25c
--- /dev/null
+++ b/src/main/java/cn/somkit/fmt/socket/WebSocketAutoConfig.java
@@ -0,0 +1,23 @@
+package cn.somkit.fmt.socket;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+
+@Configuration
+@EnableWebSocket
+public class WebSocketAutoConfig implements WebSocketConfigurer {
+
+ @Bean
+ public WebSocketServerHandler webSocketServerHandler() {
+ return new WebSocketServerHandler();
+ }
+
+ @Override
+ public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
+ registry.addHandler(webSocketServerHandler(), "/socket/ws")//设置连接路径和处理
+ .setAllowedOrigins("*");//允许跨域访问
+ }
+}
diff --git a/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java b/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java
new file mode 100644
index 0000000..15d399c
--- /dev/null
+++ b/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java
@@ -0,0 +1,57 @@
+package cn.somkit.fmt.socket;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import cn.metona.cache.Cache;
+import cn.somkit.fmt.entity.LoggerMessage;
+import cn.somkit.fmt.utils.LoggerQueue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.*;
+
+import java.io.IOException;
+
+@Component
+public class WebSocketServerHandler implements WebSocketHandler {
+
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ @Autowired
+ private Cache cache;
+
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+ push(session);
+ }
+
+ private void push(WebSocketSession session) throws IOException {
+ while (StrUtil.isBlankIfStr(cache.get("closed")) || !Boolean.parseBoolean(String.valueOf(cache.get("closed")))) {
+ LoggerMessage log = LoggerQueue.getInstance().poll();
+ if(log != null){
+ session.sendMessage(new TextMessage(JSONUtil.toJsonStr(log)));
+ }
+ }
+ }
+
+ @Override
+ public void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {
+ push(session);
+ }
+
+ @Override
+ public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+
+ }
+
+ @Override
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
+
+ }
+
+ @Override
+ public boolean supportsPartialMessages() {
+ return false;
+ }
+}
diff --git a/src/main/java/cn/somkit/fmt/utils/ApplicationContextProvider.java b/src/main/java/cn/somkit/fmt/utils/AppContext.java
similarity index 90%
rename from src/main/java/cn/somkit/fmt/utils/ApplicationContextProvider.java
rename to src/main/java/cn/somkit/fmt/utils/AppContext.java
index 8acb4f0..25eea31 100644
--- a/src/main/java/cn/somkit/fmt/utils/ApplicationContextProvider.java
+++ b/src/main/java/cn/somkit/fmt/utils/AppContext.java
@@ -6,7 +6,7 @@ import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
-public class ApplicationContextProvider implements ApplicationContextAware {
+public class AppContext implements ApplicationContextAware {
private static ApplicationContext context;
diff --git a/src/main/java/cn/somkit/fmt/utils/LoggerQueue.java b/src/main/java/cn/somkit/fmt/utils/LoggerQueue.java
index 7ecc214..07754d7 100644
--- a/src/main/java/cn/somkit/fmt/utils/LoggerQueue.java
+++ b/src/main/java/cn/somkit/fmt/utils/LoggerQueue.java
@@ -7,7 +7,7 @@ import java.util.concurrent.LinkedBlockingQueue;
public final class LoggerQueue {
private static final LoggerQueue INSTANCE = new LoggerQueue();
- private final BlockingQueue queue = new LinkedBlockingQueue<>();
+ private final BlockingQueue queue = new LinkedBlockingQueue<>(100000);
public static LoggerQueue getInstance() {
return INSTANCE;
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index 477245a..cc96ce5 100644
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -6,7 +6,7 @@
- INFO
+ DEBUG
${CONSOLE_LOG_PATTERN}
@@ -15,7 +15,7 @@
-
+
diff --git a/src/main/resources/templates/logging.html b/src/main/resources/templates/logging.html
index 50fe9fb..76eb5bd 100644
--- a/src/main/resources/templates/logging.html
+++ b/src/main/resources/templates/logging.html
@@ -19,9 +19,12 @@