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 new file mode 100644 index 00000000..71de8c3b --- /dev/null +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/WarningLogExecutor.java @@ -0,0 +1,67 @@ +package com.imdroid.sideslope.bd; + +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.stream.Collectors; + +@Component +public class WarningLogExecutor { + + // 警告日志生成 + @Value("${log.directory}") + private String logDirectory; + private final ExecutorService executor; + + public WarningLogExecutor() { + this.executor = Executors.newFixedThreadPool(4); + } + + public void generateWarningLogs(String keyword) { + try { + 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)); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + executor.shutdown(); + } + } + + 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); + + try (BufferedReader reader = Files.newBufferedReader(logFile); + BufferedWriter writer = Files.newBufferedWriter(warningFile, StandardOpenOption.CREATE, StandardOpenOption.APPEND)) { + + String line; + while ((line = reader.readLine()) != null) { + // 行如果包含了特定的关键词,比如站点的编号,则记录这一行 + if (line.contains(keyword)) { + writer.write(line); + writer.newLine(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java index 555b48c7..fd7a0a08 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java @@ -3,6 +3,7 @@ package com.imdroid.sideslope.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.imdroid.common.util.NumberUtils; import com.imdroid.secapi.dto.*; +import com.imdroid.sideslope.bd.WarningLogExecutor; import com.imdroid.sideslope.sal.Device; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -21,6 +22,8 @@ public class WarningServiceImpl implements WarningService { WarningMsgMapper warningMsgMapper; @Autowired GnssStatusMapper gnssStatusMapper; + @Autowired + private WarningLogExecutor warningLogExecutor; // warning type <-> level & value Map cfgMap = new ConcurrentHashMap<>(); @@ -174,6 +177,9 @@ public class WarningServiceImpl implements WarningService { warningMsgMapper.insert(warningMsg); //告警级别 curStatus.setWarningcode(curStatus.getWarningcode() | warningType); + + // 新告警出现后,生成对于设备的 warning 日志文件 + generate_warning_logs(curStatus.getDeviceid()); } isUpdated = true; } @@ -219,4 +225,8 @@ public class WarningServiceImpl implements WarningService { } } } + + public void generate_warning_logs(String device_id){ + warningLogExecutor.generateWarningLogs(device_id); + } }