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 @@