从零手撸 SpringBoot 日志分析系统:打造高性能


来自: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进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!

文明发言,以交流技术、职位内推、行业探讨为主
广告人士勿入,切勿轻信私聊,防止被骗


⬇程序员工具!                                      朕已阅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值