一个独立开发者的审计日志平台独立开发无羡分享从零搭建统一审计日志平台的全过程API Key 鉴权、React shadcn/ui 前端、Nginx Supervisor 部署上线。为什么要做审计日志我的在线考试系统、云深不知处博客、一纸云深小程序——三个服务跑在同一台 ECS 上每次排查问题都要分别登录各服务器看日志。更难受的是查「谁在什么时候做了什么操作」全靠翻文件效率极低。我需要一个统一的审计日志平台✅ 各服务统一写入集中查询✅ 多维筛选用户、操作、时间、资源✅ 部署独立不耦合任何一个业务系统技术选型模块选型理由后端框架Spring Boot 3.2现有项目统一复用经验ORMMyBatis-Plus代码量最少数据库MySQL 8.0RDS 已有不加新中间件前端React shadcn/ui TailwindCSS轻量、美观、组件丰富数据库版本管理Liquibase自动建表增量变更数据库设计两张表非常简单t_operation_log 审计日志主表字段类型说明idbigint (自增)主键user_namevarchar(50)操作人operation_namevarchar(64)操作名称如删除试卷operation_resulttinyint0-成功 1-失败 2-部分成功log_typetinyint0-操作日志 1-系统日志 2-安全日志log_leveltinyint0-重要 1-一般 2-提示server_namevarchar(64)服务名称resource_typevarchar(32)资源类型如 exam/paper/userresource_idvarchar(64)资源 IDdetailtext操作详情start_timebigint操作开始时间end_timebigint操作结束时间create_timedatetime记录入库时间索引只有 3 个user_name、resource_typeresource_id联合、create_time。审计日志写多读少索引越少写入越快。t_server_name_info 服务字典表记录有哪些服务接入前端下拉框读取用避免 DISTINCT 扫大表。后端 API方法路径说明POST/api/v1/logs写入一条日志GET/api/v1/logs分页列表 多维筛选GET/api/v1/logs/{id}单条详情GET/api/v1/server-names服务字典列表写入示例POST/api/v1/logs{userName:admin,operationName:删除试卷,operationResult:0,logType:0,logLevel:1,serverName:考试系统,resourceType:paper,resourceId:55,detail:管理员 admin 删除了试卷「期末模拟考」}鉴权API Key前端每次请求自动带X-Audit-Key请求头后端 Filter 拦截校验。一开始没做后来考虑到公网部署的风险加上的——虽然只是内部工具但「知道地址就能用」终究不安全。前端设计用 React shadcn/ui TailwindCSS暖色调 UI列表页分页表格 按用户名/服务/类型/时间的多维筛选详情页概览卡片 操作详情展示快捷筛选标签操作日志 / 系统日志 / 安全日志部署老规矩ECS Nginx Supervisor。Maven 打成 jar 包上传到服务器Supervisor 管理进程Nginx 反代前端静态文件和 APICertbot 扩域到已有 SSL 证书。测试数据乌龙上线后我发现测试数据还在页面上排查半天发现是前端api.ts里把API_BASE硬编码成了localhost:8090。线上浏览器请求本地端口读到了我本地数据库的数据。改成环境变量VITE_API_BASE后解决。各服务接入其他 Spring Boot 项目只需要一个RestTemplate就能接入restTemplate.postForObject(https://audit.wuxiannet.com/api/v1/logs,auditLogBody,Map.class);总结审计日志平台的核心价值不在于技术多复杂而在于「统一」。以前查问题要登录三台机器翻文件现在一个页面全搞定。对于独立开发者来说这种基础设施类的东西早做早省心。关于作者无羡独立开发者专注AI应用开发。 分类全栈开发 关注我获取更多技术分享 个人博客云深不知处 独立开发省钱攻略查看详情 个人门户wuxiannet.com — 我的独立开发作品全集如果这篇文章对你有帮助欢迎点赞、收藏、关注你的支持是我持续创作的动力点击「阅读原文」查看我的独立开发笔记