
来自:https://blog.csdn.net/qq_44474810
推荐一个程序员编程资料站:
http://cxyroad.com
副业赚钱专栏:https://xbt100.top
2024年IDEA最新激活方法
后台回复:激活码
CSDN免登录复制代码插件下载:
CSDN复制插件
以下是正文。
前言
最近在项目中遇到了一个棘手的问题:生产环境的MyBatis日志文件越来越大,手动查找慢SQL变得异常困难。为了方便方便做日志分析,写了个分析日志的系统
PS:py更方便,但是这个版本是基于java的。
项目背景
遇到的问题
• 日志文件巨大: 生产环境的日志文件动辄几百MB,手动查找慢SQL如同大海捞针
• 格式不统一: 不同项目的日志格式略有差异,需要灵活适配
• 性能要求高: 需要快速处理大文件,不能影响系统正常运行
• 分析维度多: 不仅要找到慢SQL,还要分析执行时间、参数、频率等
技术选型思考
经过调研,我选择了以下技术栈:
• 后端: Spring Boot + Java 8+(稳定可靠,生态丰富)
• 前端: Vue.js + Element UI(开发效率高,组件丰富)
• 数据库: MySQL(轻量级,易于部署)
• 核心算法: 正则表达式 + 多线程处理(性能优秀)
系统架构设计
整体架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端界面 │ │ 后端API │ │ 数据库 │
│ Vue.js │◄──►│ Spring Boot │◄──►│ MySQL │
│ Element UI │ │ MyBatis │ │ log_template │
└─────────────────┘ └─────────────────┘ └─────────────────┘
核心模块
• 日志解析引擎: 负责解析不同格式的日志文件
• 模板管理系统: 支持自定义日志格式模板
• 性能监控系统: 实时监控处理性能和系统状态
• 结果展示系统: 提供友好的用户界面和数据导出
核心技术实现
1. 高性能日志解析
多线程批处理
// 分批处理,避免内存溢出
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提高并发性能
Map<String, SqlExecutionInfo> sqlExecutionMap = new ConcurrentHashMap<>();
// 自动缓存清理机制
private void cleanupExpiredCache(Map<String, SqlExecutionInfo> sqlExecutionMap) {
long currentTime = System.currentTimeMillis();
long expireTime = currentTime - 300000; // 5分钟过期
sqlExecutionMap.entrySet().removeIf(entry -> {
SqlExecutionInfo info = entry.getValue();
return info.getStartTime() != null &&
info.getStartTime().toEpochSecond(java.time.ZoneOffset.UTC) * 1000 < expireTime;
});
}
2. 灵活的正则表达式模板
模板设计
系统支持三种主要的正则表达式模板:
• Preparing模板: 匹配SQL准备语句
• Parameters模板: 匹配SQL参数
• Total模板: 匹配SQL执行结果
// MyBatis标准格式模板
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标准格式: 最常用的MyBatis日志格式
• Spring Boot格式: 支持多种时间格式的Spring Boot日志
• Nginx Access Log: 支持HTTP请求性能分析
3. 性能监控系统
监控指标
@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);
}
实时性能报告
系统会生成详细的性能报告,包括:
• 文件处理统计(文件数、字节数、行数)
• 处理性能指标(吞吐量、处理速度、平均时间)
• 正则匹配效率(匹配成功率、尝试次数)
• 缓存使用情况(缓存大小、清理次数)
• 错误统计(错误数量、类型分布)
4. 前端虚拟滚动
大数据量展示优化
// 虚拟滚动实现
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);
}
踩坑经验分享
1. 正则表达式匹配问题
问题: 最初的正则表达式匹配率很低,很多SQL语句无法正确识别。
原因分析:
• 日志格式存在细微差异
• 时间格式不统一
• 特殊字符转义问题
解决方案:
// 支持多种时间格式的正则表达式
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})?)");
}
2. 内存溢出问题
问题: 处理大文件时经常出现内存溢出。
原因分析:
• 一次性加载整个文件到内存
• 缓存没有及时清理
• 线程池资源没有合理控制
解决方案:
// 分批处理大文件
private static final int BATCH_SIZE = 1000; // 批处理大小
private static final int MAX_CACHE_SIZE = 10000; // 最大缓存SQL数量
// 使用NIO读取文件
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;
}
性能优化实践
1. 多线程优化
• 线程池大小: 根据CPU核心数动态调整
• 批处理大小: 平衡内存使用和处理效率
• 任务分配: 合理分配任务,避免线程饥饿
2. 内存优化
• 对象复用: 减少对象创建和GC压力
• 缓存策略: LRU缓存,及时清理过期数据
• 流式处理: 大文件采用流式处理,避免内存溢出
3. 算法优化
• 预过滤: 快速跳过无关行,减少正则匹配次数
• 索引优化: 使用Map结构提高查找效率
• 批量操作: 减少数据库操作次数
实际效果展示
性能指标
经过优化后,系统性能表现优异:
• 处理速度: 平均55000行/秒
• 吞吐量: 4MB/s
• 内存使用: 可控在500MB-2GB范围内
• 准确率: SQL匹配准确率>95%
功能特性
• 多格式支持: 支持MyBatis、Spring Boot、Nginx等多种日志格式
• 智能分析: 自动识别慢SQL,提供详细分析报告
• 实时监控: 性能指标实时更新,支持性能优化建议
• 数据导出: 支持CSV格式导出,便于进一步分析
效果图
项目总结
业务价值
• 效率提升: 从手动查找慢SQL到自动化分析,效率提升10倍以上
• 问题定位: 能够快速定位性能问题,减少故障排查时间
• 性能优化: 为数据库优化提供了数据支撑
• 运维支持: 为运维团队提供了强大的日志分析工具
未来规划
• 机器学习: 引入ML算法,自动识别异常SQL模式
• 实时分析: 支持实时日志流分析
• 可视化增强: 添加更多图表和统计功能
• 分布式支持: 支持集群部署和分布式处理
源码地址
https://gitee.com/jack_fly/analysis_log
<END>
推荐阅读:
免费体验AI图片生成,就在 Image Generator Hub!
后端专属技术群
构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!
文明发言,以交流技术、职位内推、行业探讨为主 广告人士勿入,切勿轻信私聊,防止被骗 ⬇程序员工具! 朕已阅
1793

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



