当前位置: 首页 > news >正文

一个独立开发者的审计日志平台

一个独立开发者的审计日志平台

独立开发无羡,分享从零搭建统一审计日志平台的全过程: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/user
resource_idvarchar(64)资源 ID
detailtext操作详情
start_timebigint操作开始时间
end_timebigint操作结束时间
create_timedatetime记录入库时间

索引只有 3 个:user_nameresource_type+resource_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 反代前端静态文件和 API,Certbot 扩域到已有 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 — 我的独立开发作品全集

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是我持续创作的动力!

点击「阅读原文」查看我的独立开发笔记

http://www.jsqmd.com/news/1132469/

相关文章:

  • Linux 系统中定位与设置 JAVA_HOME 目录
  • MNIST 数据集 3 种主流框架加载对比:PyTorch vs TensorFlow vs Hugging Face Datasets
  • Educator头歌答案分享:数据预处理与特征工程在线实验闯关
  • Pot Desktop:5大核心功能解密,3分钟掌握跨平台翻译神器
  • Java面试突击指南!1个月拿下Java高级开发岗!AI大模型简历必备/面试必备!
  • Agentic RAG 方案深度解析:从概念到落地
  • 如何在Linux上流畅运行Windows游戏:DXVK终极配置指南
  • Fastboot Enhance:Windows平台一站式Android刷机工具箱,告别命令行复杂操作
  • Markdown锚点跳转失败的解决办法
  • Jetson Nano Super + Ubuntu 22.04 + ROS2 Humble:MID-360、FAST-LIO 与 EGO-Planner 实时建图部署记录
  • pytest-xdist分布式测试:加速APP自动化测试的架构与实战
  • 互联网大厂 Java 面试实录:谢飞机的三轮攻防战
  • 前后端分离爱心商城系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 从零搭建一个单节点 K8S 可观测实验室(一):从 Ubuntu 24.04 开始
  • HarmonyOS 小游戏《对战五子棋》开发第3篇-项目配置文件全解析
  • AI 已经改变工作方式,我们该怎么适应这场变化?
  • Codex 使用 Playwright Test Agents
  • 换种不同的方式调用WCF服务[提供源代码下载]
  • 3步解锁中医AI:如何让“仲景“大语言模型成为你的智能中医助手
  • 程序员的语言“艳遇史”(四) ——数学系师姐forth
  • 尽量减少对DOM的操作
  • mnist-数据集的学习-3.6手写数字识别
  • Tableau新手实战指南:3天做出可交付业务看板
  • 【学习记录】Week14(一):信息泄露系统化方法论与 ORW 基础体系构建
  • 用虚拟机实际体验Google Chromium OS (Chrome OS) Pre-Built
  • FastAPI 新手入门第 8 篇:让 /docs 更像一份 API 文档
  • 【 CLI与GUI两种AI编程范式技术解析】终端Agent与可视化IDE架构对比
  • ClaudeCode Skills:IDE内可工程化的AI编程技能体系
  • 从 Agent Memory 到 Object-Scoped Context 的思考
  • !ccstatusline:让你的 Claude Code 状态栏直接封神!