前言
在日常开发和维护中,我们经常需要快速查看服务器最新生成的日志文件,并从中筛选出关键的 ERROR 错误信息。虽然市面上有 ELK、Splunk 等大型日志分析平台,但在一些轻量级场景或临时排查中,编写一个简单直接的 Java 工具类往往更加高效。
一、核心功能设计
我们的目标工具需要具备以下能力:
-
自动遍历指定目录。
-
锁定最后修改时间最新的那个
.log文件。 -
逐行读取,筛选出包含
ERROR的行。 -
预留了调用 AI 大模型 分析错误并输出解决方案的接口。
二、应用场景
-
快速排查: 当服务报错时,无需登录服务器使用
grep命令,直接运行此工具类即可定位最新错误。 -
自动化巡检脚本:结合 Crontab 或 Spring Schedule,每分钟运行一次,自动发现新产生的 ERROR 日志。
-
AI 辅助运维 Demo:作为引入大模型进行智能运维(AIOps)的最小可行性产品(MVP),验证"错误日志自动分析"的流程。
三、代码实现详解
java
package org.jeecg.modules.utils;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Comparator;
import java.util.Optional;
import java.util.stream.Stream;
@Slf4j
public class ServiceLogUtil {
private static final String directoryPath = "文件目录地址";// 文件目录地址
private static final String fileSuffix = ".log";// 文件后缀
public static void main(String[] args) {
// 1.获取目录下所有文件
try (Stream<Path> paths = Files.walk(Paths.get(directoryPath))) {
// 2.过滤出 .log 普通文件,并找出最新修改的
Optional<Path> latestLogFile = paths
.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(fileSuffix))
.max(Comparator.comparingLong(p -> p.toFile().lastModified()));
// 3.如果存在最新文件,则处理
latestLogFile.ifPresent(p -> {
// 4.读取文件行
try (Stream<String> lines = Files.lines(p)) {
// 5.遍历行,筛选出 ERROR 行并打印
lines.forEach(line -> {
if (line != null && line.contains("ERROR")) {
// 6.打印错误行
System.out.println(line);
// 7.调用AI大模型,将错误行发送给AI大模型
String json = "解决方案:XXXXXXX," + line;
// 8.将AI大模型的回复发送给相关人员
log.error(json);
}
});
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}