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