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 选中如下图:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。