diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/WarningLogExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/WarningLogExecutor.java index 61f3d491..59ab4fa7 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/WarningLogExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/WarningLogExecutor.java @@ -1,42 +1,50 @@ package com.imdroid.sideslope.bd; import com.imdroid.common.util.ThreadManager; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; import java.io.*; import java.nio.file.*; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Arrays; import java.util.List; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Component public class WarningLogExecutor { - // 警告日志生成 @Value("${log.directory}") private String logDirectory; private final ExecutorService executor; + // 记录已初始化的文件 + private final ConcurrentHashMap initializedFiles = new ConcurrentHashMap<>(); public WarningLogExecutor() { - this.executor = ThreadManager.getFixedThreadPool(); + this.executor = ThreadManager.getSingleThreadPool("warning_log_thread"); } - public void generateWarningLogs(String keyword) { + public void generateWarningLogs(String keyword, String warningTypeName) { try { + String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")); + String warningFileName = "Warning-" + keyword + "-" + date + ".log"; + Path warningFile = Paths.get(logDirectory, warningFileName); + + // 如果是新文件,先写入初始化信息 + if (initializedFiles.putIfAbsent(warningFileName, true) == null) { + initializeWarningFile(warningFile, keyword, warningTypeName); + } + + // 找到日志文件 List logFiles = Files.list(Paths.get(logDirectory)) .filter(Files::isRegularFile) .filter(path -> path.getFileName().toString().matches("sideslopertcm(\\.\\d{4}-\\d{2}-\\d{2}\\.\\d+)?\\.log")) .collect(Collectors.toList()); for (Path logFile : logFiles) { - executor.submit(() -> processFile(logFile, keyword)); + executor.submit(() -> processFile(logFile, keyword, warningTypeName, warningFile)); } } catch (IOException e) { e.printStackTrace(); @@ -45,17 +53,35 @@ public class WarningLogExecutor { } } - private void processFile(Path logFile, String keyword) { - String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); - String warningFileName = "Warning-" + keyword + "-" + date + ".log"; - Path warningFile = Paths.get(logDirectory, warningFileName); + private void initializeWarningFile(Path warningFile, String keyword, String warningTypeName) { + try (BufferedWriter writer = Files.newBufferedWriter(warningFile, + StandardOpenOption.CREATE, StandardOpenOption.APPEND)) { + writer.write("=== Warning Log File ==="); + writer.newLine(); + writer.write("Created Time: " + LocalDateTime.now()); + writer.newLine(); + writer.write("Warning Type Name: " + warningTypeName); + writer.newLine(); + writer.write("Keyword: " + keyword); + writer.newLine(); + writer.write("=============================="); + writer.newLine(); + writer.newLine(); + } catch (IOException e) { + e.printStackTrace(); + } + } + private void processFile(Path logFile, String keyword, String warningTypeName, Path warningFile) { try (BufferedReader reader = Files.newBufferedReader(logFile); - BufferedWriter writer = Files.newBufferedWriter(warningFile, StandardOpenOption.CREATE, StandardOpenOption.APPEND)) { + BufferedWriter writer = Files.newBufferedWriter(warningFile, + StandardOpenOption.CREATE, StandardOpenOption.APPEND)) { + + writer.write("Processing source file: " + logFile.getFileName()); + writer.newLine(); String line; while ((line = reader.readLine()) != null) { - // 行如果包含了特定的关键词,比如站点的编号,则记录这一行 if (line.contains(keyword)) { writer.write(line); writer.newLine();