在日常项目维护中,性能瓶颈往往隐藏得最深、最狡猾。尤其是在生产环境,MyBatis 的日志文件动辄数百 MB,手动翻找慢 SQL 简直是一场灾难。 笔者在一次项目调优中深受其害,于是决定自研一套基于 Spring Boot 的日志分析平台,从根源上解决这些问题——不仅要能找到慢 SQL,还要能实时监控系统性能、缓存使用与正则匹配效率。
在日常项目维护中,性能瓶颈往往隐藏得最深、最狡猾。尤其是在生产环境,MyBatis 的日志文件动辄数百 MB,手动翻找慢 SQL 简直是一场灾难。 笔者在一次项目调优中深受其害,于是决定自研一套基于 Spring Boot 的日志分析平台,从根源上解决这些问题——不仅要能找到慢 SQL,还要能实时监控系统性能、缓存使用与正则匹配效率。
相比用 Python 快速脚本方案,这次我坚持用 Java + Spring Boot 实现企业级日志分析引擎,目的只有一个: “让日志不再是黑盒,而是精准可视的性能诊断仪表盘!”
项目背景与痛点分析
遇到的典型问题
|
问题场景 |
描述 |
|
日志文件过大 |
单个 MyBatis 日志文件常常高达数百 MB,查找慢 SQL 仿佛大海捞针 |
|
格式不统一 |
各项目团队使用不同的日志模板,解析难度高 |
|
性能要求高 |
需要处理超大日志文件,且不能阻塞主系统 |
|
分析维度多 |
需支持 SQL 执行时长、参数、频率等多维度分析 |
技术选型与整体架构
技术栈选型
|
层级 |
技术 |
说明 |
|
后端 |
Spring Boot + Java 17 |
稳定可靠,支持多线程与高并发 |
|
前端 |
Vue.js + Element UI |
高效开发,组件生态完善 |
|
数据库 |
MySQL |
存储分析模板与日志结果 |
|
核心算法 |
正则表达式 + 并行处理 |
高性能、可扩展 |
系统整体架构
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 前端界面(Vue) │ ◄──► │ 后端API(Spring) │ ◄──► │ 数据库(MySQL) │
│ Element UI + JS │ │ 日志分析引擎 │ │ log_template表 │
└──────────────────┘ └──────────────────┘ └──────────────────┘
系统划分为以下四个核心模块:
- 日志解析引擎:多线程解析大规模日志文件
- 模板管理系统:自定义不同日志格式解析模板
- 性能监控系统:实时监控处理性能与缓存状态
- 结果展示系统:前端可视化展示与搜索分析
核心模块与关键实现
高性能日志解析引擎
多线程批处理机制
为避免一次性加载导致内存溢出,采用分批异步执行方式处理日志。
// com/icoderoad/log/analyzer/core/LogBatchProcessor.java
List<Future<Void>> futures = new ArrayList<>();
for (int i = 0; i < lines.size(); i += BATCH_SIZE) {
final int startIndex = i;
int endIndex = Math.min(i + BATCH_SIZE, lines.size());
List<String> batch = lines.subList(i, endIndex);
// 提交异步任务
Future<Void> future = executorService.submit(() -> {
processBatch(batch, startIndex, sqlExecutionMap, slowSqlResults);
return null;
});
futures.add(future);
}
智能缓存管理机制
使用高性能的 ConcurrentHashMap 作为缓存容器,并定期清理过期数据。
// com/icoderoad/log/analyzer/cache/SqlCacheManager.java
Map<String, SqlExecutionInfo> sqlExecutionMap = new ConcurrentHashMap<>();
private void cleanupExpiredCache(Map<String, SqlExecutionInfo> sqlExecutionMap) {
long currentTime = System.currentTimeMillis();
long expireTime = currentTime - 300_000; // 5分钟过期
sqlExecutionMap.entrySet().removeIf(entry -> {
SqlExecutionInfo info = entry.getValue();
return info.getStartTime() != null &&
info.getStartTime().toEpochSecond(java.time.ZoneOffset.UTC) * 1000 < expireTime;
});
}
灵活的正则模板系统
系统支持 多种日志格式模板,可自定义正则表达式用于 SQL 日志解析。
// com/icoderoad/log/analyzer/template/RegexTemplates.java
String preparingRegex = "(?<time>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) " +
"\\[(?<thread>[^\\]]+)\\] DEBUG (?<class>[\\w\\.]+) - ==> Preparing: (?<sql>.+)";
String parametersRegex = "(?<time>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) " +
"\\[(?<thread>[^\\]]+)\\] DEBUG (?<class>[\\w\\.]+) - ==> Parameters: (?<params>.+)";
String totalRegex = "(?<time>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) " +
"\\[(?<thread>[^\\]]+)\\] TRACE (?<class>[\\w\\.]+) - <== Total: (?<total>\\d+)";
支持多模板类型:
- MyBatis 标准日志
- Spring Boot 统一日志格式
- Nginx 访问日志(HTTP性能分析)
实时性能监控系统
// com/icoderoad/log/analyzer/monitor/LogAnalysisPerformanceMonitor.java
@Component
public class LogAnalysisPerformanceMonitor {
private final AtomicLong totalProcessedLines = new AtomicLong(0);
private final AtomicLong totalProcessedBytes = new AtomicLong(0);
private final AtomicLong totalProcessingTime = new AtomicLong(0);
private final AtomicInteger totalSlowSqlCount = new AtomicInteger(0);
private final AtomicInteger totalFilesProcessed = new AtomicInteger(0);
private final AtomicLong totalRegexMatches = new AtomicLong(0);
private final AtomicLong totalRegexAttempts = new AtomicLong(0);
private final AtomicLong maxCacheSize = new AtomicLong(0);
private final AtomicLong totalCacheCleanups = new AtomicLong(0);
}
生成实时性能报告,包括:
- 文件与行数统计
- 吞吐率、平均处理时间
- 正则匹配成功率
- 缓存使用与清理频率
- 错误分布统计
前端高性能展示优化
通过 虚拟滚动 技术避免一次性渲染大数据量。
// src/views/LogView.vue
updateVisibleItems() {
const start = Math.floor(this.scrollTop / this.itemHeight);
const end = Math.min(start + this.visibleCount, this.filteredResults.length);
this.visibleItems = this.filteredResults
.slice(start, end)
.map((item, index) => ({
...item,
offset: (start + index) * this.itemHeight,
}));
}
并支持防抖搜索,提升交互性能:
handleSearch() {
if (this.searchTimeout) clearTimeout(this.searchTimeout);
this.searchTimeout = setTimeout(() => this.performSearch(), 300);
}
实战优化与踩坑经验
正则匹配率低的问题
多项目日志时间格式不同,最初正则匹配成功率低。 优化后支持带毫秒或不带毫秒格式:
private String adjustTimeRegex(String regex) {
return regex.replace(
"(?<time>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})",
"(?<time>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(?::\\d{3}|\\.\\d{3})?)"
);
}
内存溢出与性能瓶颈
采用 NIO + 批处理机制有效避免 OOM。
private static final int BATCH_SIZE = 1000;
private static final int MAX_CACHE_SIZE = 10000;
private List<String> readFileLines(MultipartFile file) throws IOException {
List<String> lines = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
}
return lines;
}
性能优化总结
|
优化方向 |
技术手段 |
效果 |
|
多线程优化 |
动态线程池、批量任务分配 |
提升 3~5 倍吞吐量 |
|
内存优化 |
LRU 缓存 + 对象复用 |
稳定运行 500MB~2GB 内存区间 |
|
算法优化 |
预过滤 + Map索引 |
SQL 匹配准确率提升至 95% |
系统实测性能
|
指标 |
优化前 |
优化后 |
|
处理速度 |
8,000 行/s |
🚀 55,000 行/s |
|
吞吐量 |
0.7 MB/s |
4 MB/s |
|
内存占用 |
>5GB |
500MB~2GB |
|
SQL识别率 |
75% |
95%+ |
功能亮点与可扩展性
支持多日志格式(MyBatis / Spring Boot / Nginx) 自动识别慢 SQL 并生成报告 实时性能监控与可视化分析 支持 CSV 导出与在线搜索
结语:从数据到洞察,真正的“日志智能化”
这套日志分析平台,从零实现了 “从采集到洞察”的全链路可观测性。 从最初的“手动翻日志”到“智能诊断性能瓶颈”,不仅极大提升了问题定位效率,也为后续性能优化提供了坚实的数据支撑。
未来计划包括:
- 引入机器学习识别异常 SQL 模式
- 实现实时日志流分析
- 增强可视化统计面板
- 支持分布式部署与集群扩展
AI大模型学习福利
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

被折叠的 条评论
为什么被折叠?



