From 690e9288b872fbbe6f70fb4cfcccfdd0ae3f70bf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=B4=AB=E5=BD=B1233?= <1440196015@qq.com>
Date: Sat, 26 Jul 2025 00:42:38 +0800
Subject: [PATCH] =?UTF-8?q?v2.1.3=20=E6=9B=B4=E6=96=B0=EF=BC=9A=20=20=20?=
=?UTF-8?q?=20=201=E3=80=81=E4=BD=BF=E7=94=A8ServletContextListener?=
=?UTF-8?q?=E6=96=B9=E5=BC=8F=E8=8E=B7=E5=8F=96=E5=AE=9E=E6=97=B6=E6=97=A5?=
=?UTF-8?q?=E5=BF=97=20=20=20=20=202=E3=80=81=E9=A1=B5=E9=9D=A2=E6=97=A5?=
=?UTF-8?q?=E5=BF=97=E8=A6=81=E7=B4=A0=E6=B7=BB=E5=8A=A0=E8=BF=9B=E7=A8=8B?=
=?UTF-8?q?id=E5=92=8C=E7=BA=BF=E7=A8=8B=E5=90=8D=E7=A7=B0=EF=BC=8C?=
=?UTF-8?q?=E4=BC=98=E5=8C=96=E6=A0=B7=E5=BC=8F=20=20=20=20=203=E3=80=81?=
=?UTF-8?q?=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0=E7=BA=A7=E5=88=AB=E8=B0=83?=
=?UTF-8?q?=E6=95=B4=E4=B8=BAINFO?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
.../cn/somkit/fmt/action/DownloadAction.java | 13 ++++-
.../somkit/fmt/config/LogMonitorAppender.java | 35 +++++++++++++
.../fmt/config/LogbackConfigListener.java | 25 +++++++++
.../cn/somkit/fmt/entity/LoggerMessage.java | 22 +++++++-
.../cn/somkit/fmt/filter/LogStashFilter.java | 52 -------------------
src/main/resources/logback-spring.xml | 6 +--
src/main/resources/templates/logging.html | 3 +-
版本记录/readme.md | 6 +++
9 files changed, 104 insertions(+), 60 deletions(-)
create mode 100644 src/main/java/cn/somkit/fmt/config/LogMonitorAppender.java
create mode 100644 src/main/java/cn/somkit/fmt/config/LogbackConfigListener.java
delete mode 100644 src/main/java/cn/somkit/fmt/filter/LogStashFilter.java
diff --git a/pom.xml b/pom.xml
index 23b4615..a9d50a7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
cn.somkit
fmt
- 2.1.2
+ 2.1.3
fmt
File Manage System for by SpringBoot
diff --git a/src/main/java/cn/somkit/fmt/action/DownloadAction.java b/src/main/java/cn/somkit/fmt/action/DownloadAction.java
index 0c1762a..843f3b4 100644
--- a/src/main/java/cn/somkit/fmt/action/DownloadAction.java
+++ b/src/main/java/cn/somkit/fmt/action/DownloadAction.java
@@ -1,6 +1,9 @@
package cn.somkit.fmt.action;
+import cn.hutool.json.JSONUtil;
import cn.somkit.fmt.utils.OsInfoUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
@@ -31,6 +34,8 @@ import java.util.zip.ZipOutputStream;
@RequestMapping("/download")
public class DownloadAction {
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
@Value("${somkit.upload.path.windows}")
private String windows_path;
@@ -41,6 +46,7 @@ public class DownloadAction {
public ModelAndView index(String keyboard) throws Exception{
String path = OsInfoUtil.isWindows() ? windows_path :
OsInfoUtil.isLinux() ? linux_path : null;
+ logger.info("获取文件存储路径:{}", path);
assert path != null;
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
@@ -59,6 +65,7 @@ public class DownloadAction {
list = list.stream().filter(map -> String.valueOf(map.get("filename"))
.contains(keyboard)).collect(Collectors.toList());
}
+ logger.info("关键词:{},文件数量:{}", keyboard, list.size());
ModelAndView mv = new ModelAndView();
mv.setViewName("download");
mv.addObject("files", list);
@@ -66,7 +73,7 @@ public class DownloadAction {
return mv;
}
- private static Map getObjectMap(File file) {
+ private Map getObjectMap(File file) {
BigDecimal filesize = BigDecimal.valueOf(file.length())
.divide(BigDecimal.valueOf(1024 * 1024), 2, RoundingMode.HALF_UP);
Long time = file.lastModified();
@@ -77,6 +84,7 @@ public class DownloadAction {
map.put("filepath", file.getAbsolutePath());
map.put("filesize", filesize);
map.put("filetime", filetime);
+ logger.info("文件信息:{}", JSONUtil.toJsonStr(map));
return map;
}
@@ -102,6 +110,7 @@ public class DownloadAction {
}
outputStream.flush();
} catch (IOException e) {
+ logger.error("IO错误:", e);
throw new RuntimeException("IO错误: " + e.getMessage());
} finally {
// 尝试在流关闭后删除文件
@@ -111,7 +120,7 @@ public class DownloadAction {
}
} catch (IOException e) {
// 记录日志或采取其他措施
- System.err.println("删除文件失败: " + e.getMessage());
+ logger.error("删除文件失败:{}", e.getMessage());
}
}
};
diff --git a/src/main/java/cn/somkit/fmt/config/LogMonitorAppender.java b/src/main/java/cn/somkit/fmt/config/LogMonitorAppender.java
new file mode 100644
index 0000000..8b44573
--- /dev/null
+++ b/src/main/java/cn/somkit/fmt/config/LogMonitorAppender.java
@@ -0,0 +1,35 @@
+package cn.somkit.fmt.config;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.UnsynchronizedAppenderBase;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
+import cn.metona.mq.MQToolkit;
+import cn.metona.mq.core.MessageQueue;
+import cn.somkit.fmt.entity.LoggerMessage;
+
+import java.time.Instant;
+import java.time.ZoneId;
+
+public class LogMonitorAppender extends UnsynchronizedAppenderBase {
+
+ private static final String Queue_Name = "log-monitor";
+
+ @Override
+ protected void append(ILoggingEvent event) {
+ LoggerMessage msg = new LoggerMessage(
+ event.getLevel().toString(),
+ event.getThreadName(),
+ event.getLoggerName(),
+ event.getFormattedMessage(),
+ DateUtil.format(Instant.ofEpochMilli(event.getTimeStamp()).atZone(ZoneId.systemDefault()).toLocalDateTime(),
+ "yyyy-MM-dd HH:mm:ss.SSS"),
+ ProcessHandle.current().pid()
+ );
+ //发送日志信息到日志监控队列
+ MessageQueue.QueueStats queueStats = MQToolkit.getQueueStats(Queue_Name);
+ if(queueStats != null && queueStats.isRunning() && !queueStats.isPaused()){
+ MQToolkit.sendMessage(Queue_Name, "log.monitor", JSONUtil.toJsonStr(msg));
+ }
+ }
+}
diff --git a/src/main/java/cn/somkit/fmt/config/LogbackConfigListener.java b/src/main/java/cn/somkit/fmt/config/LogbackConfigListener.java
new file mode 100644
index 0000000..25143f2
--- /dev/null
+++ b/src/main/java/cn/somkit/fmt/config/LogbackConfigListener.java
@@ -0,0 +1,25 @@
+package cn.somkit.fmt.config;
+
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class LogbackConfigListener implements ServletContextListener {
+
+ @Override
+ public void contextInitialized(ServletContextEvent event) {
+ // 配置logback
+ LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
+ Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
+
+ // 添加自定义appender
+ LogMonitorAppender appender = new LogMonitorAppender();
+ appender.setContext(loggerContext);
+ appender.start();
+ rootLogger.addAppender(appender);
+ }
+}
diff --git a/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java b/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java
index e58551d..798db5e 100644
--- a/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java
+++ b/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java
@@ -2,15 +2,19 @@ package cn.somkit.fmt.entity;
public class LoggerMessage {
String level;
+ String threadName;
String name;
String message;
String timestamp;
+ long number;
- public LoggerMessage(String level, String loggerName, String message, String timestamp) {
+ public LoggerMessage(String level, String threadName, String loggerName, String message, String timestamp, long number) {
this.level = level;
+ this.threadName = threadName;
this.name = loggerName;
this.message = message;
this.timestamp = timestamp;
+ this.number = number;
}
public String getLevel() {
@@ -21,6 +25,14 @@ public class LoggerMessage {
this.level = level;
}
+ public String getThreadName() {
+ return threadName;
+ }
+
+ public void setThreadName(String threadName) {
+ this.threadName = threadName;
+ }
+
public String getName() {
return name;
}
@@ -44,4 +56,12 @@ public class LoggerMessage {
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
+
+ public long getNumber() {
+ return number;
+ }
+
+ public void setNumber(long number) {
+ this.number = number;
+ }
}
diff --git a/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java b/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java
deleted file mode 100644
index 1215ed8..0000000
--- a/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package cn.somkit.fmt.filter;
-
-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.hutool.json.JSONUtil;
-import cn.metona.mq.MQToolkit;
-import cn.metona.mq.core.MessageQueue;
-import cn.somkit.fmt.entity.LoggerMessage;
-
-import java.time.Instant;
-import java.time.ZoneId;
-
-public class LogStashFilter extends Filter {
-
- private static final String Queue_Name = "log-monitor";
-
- Level level;
-
- public LogStashFilter() {
- }
-
- @Override
- public FilterReply decide(ILoggingEvent e) {
- 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")
- );
- //发送日志信息到日志监控队列
- MessageQueue.QueueStats queueStats = MQToolkit.getQueueStats(Queue_Name);
- if(queueStats != null && queueStats.isRunning() && !queueStats.isPaused()){
- MQToolkit.sendMessage(Queue_Name, "log.monitor", JSONUtil.toJsonStr(msg));
- }
- return FilterReply.NEUTRAL;
- }
-
- public void setLevel(String level) {
- this.level = Level.toLevel(level);
- }
-
- public void start() {
- if (this.level != null) {
- super.start();
- }
-
- }
-}
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index cc96ce5..11edb4f 100644
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -5,8 +5,8 @@
-
- DEBUG
+
+ INFO
${CONSOLE_LOG_PATTERN}
@@ -15,7 +15,7 @@
-
+
diff --git a/src/main/resources/templates/logging.html b/src/main/resources/templates/logging.html
index 5f54a3f..26088b0 100644
--- a/src/main/resources/templates/logging.html
+++ b/src/main/resources/templates/logging.html
@@ -50,7 +50,8 @@
ws.onmessage = function (event) {
if(event.data){
let data = JSON.parse(event.data);
- logger.log(data.name + ' : ' + data.message, data.level, data.timestamp);
+ let message = `${data.number} --- [ ${data.threadName} ] ${data.name} : ${data.message}`;
+ logger.log(message, data.level, data.timestamp);
}
}
diff --git a/版本记录/readme.md b/版本记录/readme.md
index bbe0830..f12717d 100644
--- a/版本记录/readme.md
+++ b/版本记录/readme.md
@@ -40,4 +40,10 @@
> v2.1.2
```
升级metona-mq-mini-pro到2.0.1
+```
+> v2.1.3
+```
+ 使用ServletContextListener方式获取实时日志
+ 页面日志要素添加进程id和线程名称,优化样式
+ 日志打印级别调整为INFO
```
\ No newline at end of file