Java实现日志文件关键词搜索方式
作者:敲代码的猪猪侠
Java代码用于搜索指定目录下的日志文件,按时间排序并输出包含关键词的内容,处理大数据量时,控制台输出不完整,需调整IDE console设置以扩展缓冲区
Java日志文件关键词搜索
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class TryTraverseDemo03 {
public static void main(String[] args) {
// 设置要搜索的关键词
String keyword = "TID:5bc8f75f1ad5450dab3127896bed429b.65.16849102400674853";
// 日志文件路径
String logFilePath = "D:\\log\\home\\xiahui-wms-rfbiz-application\\xiahui-wms-rfbiz-2023-05-24.2.log";
File logFile = new File(logFilePath);
try (BufferedReader br = new BufferedReader(new FileReader(logFile))) {
String line;
int lineNum = 1;
while ((line = br.readLine()) != null) {
if (line.contains(keyword)) { // 如果这一行包含关键词
System.out.printf("[%d]: %s%n", lineNum, line); // 输出这一行
}
lineNum++;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}这段Java代码实现了读取指定路径下的日志文件,并在日志文件中搜索指定的关键词。
具体实现过程如下:
- 1.指定要搜索的关键词和日志文件路径;
- 2.创建File对象,表示要读取的日志文件;
- 3.创建BufferedReader对象,指定字符流读取日志文件内容;
- 4.读取每一行的内容,如果该行包含关键词,则将该行内容输出到控制台;
- 5.继续读取下一行,直到读取到文件末尾;
- 6.关闭BufferedReader对象,释放资源。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class LogSearcher {
public static void main(String[] args) throws ParseException {
String directoryPath = "D:\\log\\home\\xiahui-wms-rfbiz-application";
File directory = new File(directoryPath);
// 获取目录下所有的log文件路径
List<String> logFilePaths = new ArrayList<>();
for (File file : directory.listFiles()) {
if (file.isFile() && file.getName().endsWith(".log")) {
logFilePaths.add(file.getAbsolutePath());
}
}
// 循环遍历每个日志文件进行查找
List<String> targetLogs = new ArrayList<>();
for (String logFilePath : logFilePaths) {
try (BufferedReader reader = new BufferedReader(new FileReader(logFilePath))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("5bc8f75f1ad5450dab3127896bed429b.65.16849103054344859")) {
targetLogs.add(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 对结果按时间排序
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Collections.sort(targetLogs, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
Date d1 = dateFormat.parse(o1.substring(0, 19)); // 将字符串截取到时间部分,按格式解析成Date类型
Date d2 = dateFormat.parse(o2.substring(0, 19));
return d1.compareTo(d2); // 用Date类型比较时间
} catch (ParseException e) {
e.printStackTrace();
return 0;
}
}
});
// 显示查找的结果
System.out.println("Found " + targetLogs.size() + " logs:");
for (String log : targetLogs) {
System.out.println(log);
}
}
}
这段Java代码实现了在指定目录下查找所有以“.log”结尾的日志文件,并从这些日志文件中查找包含指定关键词的日志,根据时间进行排序输出结果。
具体实现过程如下:
- 1. 指定目录路径;
- 2. 创建File对象,表示要查找的目录;
- 3. 获取目录下所有以“.log”为后缀的文件路径;
- 4. 遍历每个日志文件,打开文件,按行读取内容,查找包含指定关键词的日志,并将其保存到targetLogs集合中;
- 5. 关闭文件读取流,释放资源。
- 6. 对找到的日志集合按时间进行排序,时间格式采用“yyyy-MM-dd HH:mm:ss”;
- 7. 输出找到日志的总数以及展示日志详情。
另外在使用该工具类的时候遇到一个问题,当根据某个关键字进行查询所对应的日志,当日志数据量大的时候,查询到的日志在控制台输出不完整的问题
解决方案
通过Console配置修改来修改,点击 File ->Settings ->editor - >General->Console 选中如下图:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
