大数跨境
0
0

从零手撸 SpringBoot 日志分析系统:打造高性能慢SQL检测神器

从零手撸 SpringBoot 日志分析系统:打造高性能慢SQL检测神器 供应链架构师
2025-11-22
0
导读:从零手撸 SpringBoot 日志分析系统:打造高性能慢SQL检测神器
架构师(JiaGouX)
我们都是架构师!
架构未来,你来不来?



 




前言



最近在项目中遇到了一个棘手的问题:生产环境的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·

相关阅读:


作者:新晋菜鸡

来源:blog.csdn.net/qq_44474810

版权申明:内容来源网络,仅供学习研究,版权归原创者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

架构师

我们都是架构师!



关注架构师(JiaGouX),添加“星标”

获取每天技术干货,一起成为牛逼架构师

技术群请加若飞:1321113940 进架构师群

投稿、合作、版权等邮箱:admin@137x.com


【声明】内容源于网络
0
0
供应链架构师
各类跨境出海行业相关资讯
内容 1846
粉丝 0
供应链架构师 各类跨境出海行业相关资讯
总阅读1.3k
粉丝0
内容1.8k