Java日志分析工具核心是“精准提取+高效聚合”:用命名组正则提取字段,LogEntry封装数据,Stream流式处理防OOM,Map+Collectors聚合统计,格式化输出可读报告。
用Java写日志分析工具,核心是“精准提取 + 高效聚合”,正则负责从混乱文本中捞出关键字段,集合负责归类统计。不依赖Logback或ELK,纯JDK就能干。
常见日志如:2025-05-12 14:23:18,456 [INFO] com.example.UserController - User login success: id=1001, ip=192.168.1.105。不能用split(" ")硬切——空格不唯一,字段含空格会错位。
推荐写一个带命名组的正则,兼顾可读与复用:
Pattern pattern = 
"(?
"\\s+\\[(?
匹配后用matcher.group("level")、matcher.group("msg")直接取值,比下标安全得多。遇到多行日志(如Exception堆栈),先用Pattern.DOTALL标志,再用^Caused by:等锚点分段处理。
分析目标常是:每小时ERROR数、各IP访问频次、每个接口平均耗时。别用一堆孤立的HashMap——封装成统一结构更易扩展:
LogEntry类,含timestamp(转为LocalDateTime)、level、ip、durationMs等字段LogEntry实例,丢进List
Collectors.groupingBy:单个日志文件几百MB很常见,全读进内存会OOM。要用流式处理:
Files.lines(Paths.get("app.log"))返回Stream,配合try-with-resources自动关闭DateTimeFormatter和Pattern
Collectors.teeing()一次遍历产出多个结果,而不是跑多遍streamparallelStream(),但注意正则匹配和LocalDateTime解析是无状态的,适合并行分析完数据,得让人一眼看懂。简单加点格式化:
String.format("%-15s %8s %6s", "IP", "COUNT", "TOP_URI")对齐列宽errorCountByIP.entrySet().stream().sorted(Map.Entry.comparingByValue().reversed()).limit(10)
entry.getKey() + "," + entry.getValue(),加个BOM头支持中文System.err.println("[WARN] 5min error rate > 5%!")突出告警