1. 更改告警日志收集逻辑,只保存最近一个小时范围内的日志

2. 只监控连续无固定解
This commit is contained in:
fengyarnom 2024-11-28 11:48:55 +08:00
parent 69da1b6c94
commit 55849e2e76
2 changed files with 65 additions and 69 deletions

View File

@ -210,7 +210,7 @@ public class WarningServiceImpl implements WarningService {
curStatus.setWarningcode(curStatus.getWarningcode() | warningType); curStatus.setWarningcode(curStatus.getWarningcode() | warningType);
// 新告警出现后生成对应设备的 warning 日志文件 // 新告警出现后生成对应设备的 warning 日志文件
//generate_warning_logs(curStatus.getDeviceid(),warningType,auxInfo); generate_warning_logs(curStatus.getDeviceid(),warningType,warningName);
} }
isUpdated = true; isUpdated = true;
} }
@ -258,7 +258,8 @@ public class WarningServiceImpl implements WarningService {
} }
public void generate_warning_logs(String device_id,int warning_type,String warning_type_name){ public void generate_warning_logs(String device_id,int warning_type,String warning_type_name){
if (warning_type == WarningCfg.TYPE_LOW_VOLTAGE) { // 连续无固定解
if (warning_type == WarningCfg.TYPE_NO_FIXED_RESULT) {
WarningLogExecutor warningLogExecutor = new WarningLogExecutor(logDirectory); WarningLogExecutor warningLogExecutor = new WarningLogExecutor(logDirectory);
warningLogExecutor.generateWarningLogs(device_id, warning_type_name); warningLogExecutor.generateWarningLogs(device_id, warning_type_name);
} }

View File

@ -1,21 +1,15 @@
package com.imdroid.common.util; package com.imdroid.common.util;
import java.io.*;
import java.nio.file.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors; import java.io.*;
import java.util.stream.Stream; import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
public class WarningLogExecutor { public class WarningLogExecutor {
private final String logDirectory; private final String logDirectory;
private final ExecutorService executor; private final ExecutorService executor;
// 记录已初始化的文件
private final ConcurrentHashMap<String, Boolean> initializedFiles = new ConcurrentHashMap<>();
public WarningLogExecutor(String logDirectory) { public WarningLogExecutor(String logDirectory) {
this.logDirectory = logDirectory; this.logDirectory = logDirectory;
@ -23,68 +17,69 @@ public class WarningLogExecutor {
} }
public void generateWarningLogs(String keyword, String warningTypeName) { public void generateWarningLogs(String keyword, String warningTypeName) {
// 单线程处理防止数据写入混乱
executor.submit(() -> searchLogsForDeviceID(this.logDirectory, keyword, warningTypeName));
}
public static void searchLogsForDeviceID(String dirPath, String deviceId, String warningType) {
try { try {
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")); // 判断目录是否存在一般写在 application.properties
String warningFileName = "Warning-" + keyword + "-" + date + ".log"; File dir = new File(dirPath);
Path warningFile = Paths.get(logDirectory, warningFileName); if (!dir.exists() || !dir.isDirectory()) {
return;
// 如果是新文件先写入初始化信息
if (initializedFiles.putIfAbsent(warningFileName, true) == null) {
initializeWarningFile(warningFile, keyword, warningTypeName);
} }
try (Stream<Path> logFilesStream = Files.list(Paths.get(logDirectory))) { // 只收集一小时内的日志否则太影响性能
List<Path> logFiles = logFilesStream long oneHourAgo = System.currentTimeMillis() - 3600000;
.filter(Files::isRegularFile) File[] files = dir.listFiles((d, name) -> name.startsWith("sideslopertcm"));
.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, warningFile)); if (files != null && files.length > 0) {
} Arrays.sort(files, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified()));
}
} catch (IOException e) { StringBuilder processedFiles = new StringBuilder();
e.printStackTrace(); for (File file : files) {
} finally { if (file.lastModified() >= oneHourAgo) {
executor.shutdown(); processedFiles.append(String.format("%s\n", file.getName()));
} }
} }
private void initializeWarningFile(Path warningFile, String keyword, String warningTypeName) { if (processedFiles.length() == 0) {
try (BufferedWriter writer = Files.newBufferedWriter(warningFile, return;
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, Path warningFile) { // 文件名的日期只保存年月日当天重复触发会新的覆盖旧的
try (BufferedReader reader = Files.newBufferedReader(logFile); String date = DateTimeFormatter.ofPattern("yyyyMMdd")
BufferedWriter writer = Files.newBufferedWriter(warningFile, .format(LocalDateTime.now());
StandardOpenOption.CREATE, StandardOpenOption.APPEND)) { String outputFileName = String.format("%s/Warning_%s_%s_%s.log", dirPath,deviceId,date, warningType);
writer.write("Processing source file: " + logFile.getFileName()); try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFileName))) {
writer.newLine(); writer.write("=== 搜索信息 ===\n");
writer.write("处理时间: " + LocalDateTime.now() + "\n");
writer.write("搜索目录: " + dirPath + "\n");
writer.write("设备ID: " + deviceId + "\n");
writer.write("警告类型: " + warningType + "\n\n");
writer.write("=== 处理文件列表 ===\n");
writer.write(processedFiles.toString());
writer.write("\n=== 匹配结果 ===\n");
for (File file : files) {
if (file.lastModified() >= oneHourAgo) {
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line; String line;
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
if (line.contains(keyword)) { if (line.contains(deviceId)) {
writer.write(line); writer.write(String.format("[%s] %s\n",
writer.newLine(); file.getName(), line));
} }
} }
} catch (IOException e) { }
}
}
}
}
} catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }