1. 项目概述
这个基于SSM+Vue的日志管理系统是我在指导2026届毕业生完成的一个典型课程设计项目。作为一名长期从事Java全栈开发的工程师,我发现很多高校的毕业设计项目都存在"重功能轻运维"的问题,特别是日志管理这个环节经常被忽视。这个系统正是为了解决这个问题而设计的。
系统采用前后端分离架构,后端使用Spring+SpringMVC+MyBatis框架组合,前端基于Vue.js+ElementUI构建。与传统的单体应用不同,这种架构能够更好地适应现代Web开发的趋势,也为学生提供了接触企业级开发模式的机会。
特别提示:日志管理系统看似简单,但实际开发中会遇到很多意料之外的问题,比如日志量暴增时的性能瓶颈、敏感日志的权限控制等。这些问题我都会在后续章节详细说明解决方案。
2. 技术选型解析
2.1 后端技术栈
选择SSM框架组合(Spring+SpringMVC+MyBatis)主要基于以下考虑:
-
Spring框架:提供了完善的IoC容器和AOP支持,特别适合实现日志采集的切面编程。通过@Aspect注解,我们可以轻松拦截Controller层的方法调用,记录入参、出参和异常信息。
-
MyBatis:相比Hibernate,MyBatis更适合需要精细控制SQL的场景。日志系统的查询往往需要复杂条件组合,MyBatis的动态SQL功能可以很好地满足这个需求。
-
Spring Security + JWT:为了解决前后端分离架构下的认证问题,我们采用JWT令牌方案。与传统的Session方案相比,JWT更适合RESTful API的无状态特性。
2.2 前端技术栈
Vue.js作为前端框架具有以下优势:
-
组件化开发:日志展示、分类树、权限控制等都可以封装成独立组件,提高代码复用率。
-
响应式数据绑定:当后端推送新的日志数据时,前端界面可以自动更新,无需手动操作DOM。
-
丰富的生态系统:配合ElementUI和ECharts,可以快速构建美观的数据可视化界面。
3. 核心功能实现
3.1 日志采集模块
日志采集是整个系统的基础,我们设计了多层次的采集方案:
java复制@Aspect
@Component
public class LogAspect {
private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Autowired
private LogService logService;
@Around("execution(* com..controller.*.*(..))")
public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
// 记录方法入参
Object[] args = joinPoint.getArgs();
String params = JSON.toJSONString(args);
try {
Object result = joinPoint.proceed();
long elapsedTime = System.currentTimeMillis() - startTime;
// 异步保存日志
logService.saveAsync(Log.builder()
.className(className)
.methodName(methodName)
.params(params)
.result(JSON.toJSONString(result))
.execTime(elapsedTime)
.createTime(new Date())
.build());
return result;
} catch (Exception e) {
logService.saveAsync(Log.error(className, methodName, params, e));
throw e;
}
}
}
实际开发中发现的问题:直接在高并发场景下同步写入日志会导致请求响应时间明显增加。最终我们改为异步批量写入,通过线程池和队列实现削峰填谷。
3.2 日志存储策略
系统支持两种存储方式:
- 数据库存储:结构化日志存入MySQL,便于复杂查询
- 文件存储:大文本日志写入文件系统,节省数据库空间
我们设计了自动切换机制:
| 日志类型 | 存储方式 | 触发条件 |
|---|---|---|
| 普通日志 | MySQL | 默认方式 |
| 大文本日志 | 文件 | 内容超过10KB |
| 错误日志 | 双写 | 确保关键日志不丢失 |
3.3 权限控制系统
基于RBAC模型实现了细粒度的权限控制:
-
角色定义:
- 管理员:拥有所有权限
- 开发人员:可查看所有日志,但不能删除
- 测试人员:只能查看测试环境日志
-
权限拦截:
java复制@PreAuthorize("hasRole('ADMIN') || "
+ "(hasRole('DEVELOPER') && @logAccessControl.canAccess(#logId, authentication))")
@GetMapping("/logs/{logId}")
public ResponseEntity<Log> getLogDetail(@PathVariable Long logId) {
// 实现细节...
}
4. 性能优化实践
4.1 数据库优化
针对日志系统的查询特点,我们做了以下优化:
- 分区表:按日期范围分区,加快时间区间查询
- 复合索引:建立(create_time, level, class_name)组合索引
- 查询优化:限制分页大小,默认不超过100条/页
4.2 缓存策略
高频访问的日志分类信息使用Redis缓存:
java复制@Cacheable(value = "logCategory", key = "#root.methodName")
public List<LogCategory> getAllCategories() {
return categoryMapper.selectAll();
}
4.3 前端性能优化
- 虚拟滚动:应对大量日志数据的渲染问题
- 请求合并:将多个小请求合并为一个批量请求
- 本地缓存:使用Vuex管理应用状态,减少重复请求
5. 部署与运维
5.1 环境准备
系统要求的运行环境:
- JDK 1.8+
- MySQL 5.7+
- Tomcat 8+
- Node.js 12+ (前端构建)
5.2 部署步骤
- 数据库初始化:
sql复制CREATE DATABASE log_management DEFAULT CHARACTER SET utf8mb4;
USE log_management;
SOURCE init.sql;
- 后端部署:
bash复制mvn clean package -DskipTests
cp target/log-system.war $TOMCAT_HOME/webapps/
- 前端部署:
bash复制npm install
npm run build
cp -r dist/* /var/www/html/
5.3 运维监控
建议配置的监控指标:
- 日志写入速率
- 存储空间使用情况
- 查询响应时间
- 系统错误率
6. 常见问题与解决方案
6.1 跨域问题
前后端分离部署时遇到的典型问题:
现象:前端请求后端API时出现CORS错误
解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*")
.maxAge(3600);
}
}
6.2 日志丢失问题
现象:系统重启后部分日志未能保存
原因分析:异步写入队列中的日志未持久化
解决方案:
- 引入消息队列(Kafka/RabbitMQ)保证可靠性
- 增加关机钩子处理残留日志
- 定期检查日志完整性
6.3 性能瓶颈
压测数据对比:
| 优化措施 | 吞吐量(QPS) | 平均响应时间(ms) |
|---|---|---|
| 原始方案 | 120 | 450 |
| 异步写入 | 350 | 120 |
| 增加缓存 | 800 | 60 |
| 最终方案 | 1500 | 35 |
7. 项目总结与扩展建议
经过三个月的开发和优化,这个日志管理系统已经能够满足基本的教学和生产需求。在实际使用中,我们发现以下几个值得改进的方向:
- 分布式日志收集:可以考虑集成Logstash或Fluentd,支持多节点日志汇聚
- 智能分析:引入简单的机器学习算法,自动识别异常日志模式
- 审计追踪:增强日志修改的记录功能,满足合规性要求
对于想要二次开发的同学,建议先从以下简单功能入手:
- 增加日志导出格式(如PDF、Excel)
- 实现日志订阅通知功能
- 添加操作日志记录
这个项目最大的价值不在于实现了多少功能,而是提供了一个可扩展的架构基础。通过参与这类项目的开发,学生可以系统地掌握现代Web开发的完整流程,这对未来的职业发展非常有帮助。