Skip to content

日志审计 PRD

文档信息

项目内容
产品名称PMForge - 日志审计
文档版本v2.0
创建日期2026-09-16
最后更新2026-09-24
文档状态评审中
优先级P1

一、功能概述

1.1 功能定位

日志审计是系统的"黑匣子"——就像飞机上的飞行记录仪一样,它默默记录着系统中发生的一切关键事件,一旦出了问题,管理员可以回溯每一笔操作、每一次请求、每一个异常,快速定位根因。

具体来说,日志审计模块统一管理四类日志:

日志类型通俗理解记录什么
登录日志门禁刷卡记录谁在什么时间、从哪个 IP、用什么设备登录了系统,成功还是失败
操作日志办公室监控录像用户在系统里做了什么——新建了订单、修改了用户信息、删除了数据
API 访问日志高速公路收费站记录每一次接口调用的完整信息:谁调的、花了多长时间、返回了什么结果
API 错误日志设备故障报警单接口出了什么错、错在哪一行代码、完整的异常堆栈

此外,模块还规划了安全审计能力(P2),用于自动识别异常登录行为(如异地登录、暴力破解)和审计敏感操作(如批量删除、权限变更)。

1.2 目标用户

用户类型核心诉求主要使用的日志
系统管理员"有人投诉数据被改了,我要查是谁改的"登录日志、操作日志
运维工程师"接口变慢了/报错了,我要定位问题"API 访问日志、API 错误日志
安全审计员"有没有异常的登录行为?合规审查需要导出报告"登录日志、操作日志(导出)
开发人员"线上报错了,我要看异常堆栈定位 Bug"API 错误日志、API 访问日志

1.3 业务价值

  • 🔍 操作可追溯:任何数据变更都有据可查,解决"谁改了我的数据"这类扯皮问题
  • 🛡️ 安全合规保障:满足等保二级/三级对日志审计的强制要求,支持日志导出应对审查
  • 故障快速定位:通过链路追踪编号(traceId)串联一次请求的所有日志,分钟级定位问题
  • 📊 性能可观测:API 访问日志记录每次请求的执行时长,快速识别慢接口
  • 🚨 异常主动发现:安全审计自动识别暴力破解、异地登录等威胁,变被动为主动

1.4 功能范围

功能分类后台管理端优先级说明
登录日志(查看/导出)P0记录所有登录/登出/注册行为
操作日志(查看/导出)P0记录用户的关键业务操作
API 访问日志(查看/导出)P0记录每次 API 调用的请求响应详情
API 错误日志(查看/处理/导出)P0记录 API 异常,支持处理状态流转
安全审计(异常检测/敏感操作审计)✅(规划中)P2基于日志数据的安全分析能力

说明:日志审计是纯后台管理功能,没有前台用户端页面。


二、用户场景

2.1 用户角色

角色描述核心诉求
系统管理员后台管理人员,负责日常运维追溯用户行为、导出数据审计报告
运维工程师技术运维人员,保障系统稳定监控 API 性能、排查错误、处理异常日志
安全审计员安全合规人员,确保系统安全发现异常登录、审计敏感操作、满足合规要求
开发人员研发人员,负责功能开发与 Bug 修复通过错误日志定位 Bug、分析性能瓶颈

2.2 使用场景

场景1:数据变更追溯——"谁改了这个订单?"

  • 用户:系统管理员王哥
  • 背景:客服接到用户投诉,说订单金额被莫名修改了
  • 操作步骤
    1. 王哥进入「系统管理 → 操作日志」页面
    2. 在搜索栏输入操作模块"订单",时间范围选择"最近 7 天"
    3. 列表中出现了所有订单相关的操作记录
    4. 王哥找到目标订单编号,点击"查看详情"
    5. 详情页显示:操作人"运营-小李"、操作时间、操作内容"修改编号为 20260915 的订单金额,从 299 改成 199"
    6. 王哥截图保存,找小李核实情况
  • 期望:操作明细清晰可读、支持按模块和业务编号精准筛选
  • 异常处理:如果操作日志中没有找到记录,可能是通过 API 直接调用(非页面操作),需进一步查看 API 访问日志

场景2:异常登录排查——"有人在暴力破解账号"

  • 用户:安全审计员小赵
  • 背景:收到安全告警,某账号短时间内多次登录失败
  • 操作步骤
    1. 小赵进入「系统管理 → 登录日志」页面
    2. 筛选条件:用户账号="zhangsan",登录状态="失败",时间="今天"
    3. 列表显示 15 条失败记录,全部来自同一个 IP 203.0.113.50
    4. 小赵查看 IP 归属地,发现是境外 IP
    5. 点击"导出 Excel",保存证据
    6. 联系运维将该 IP 加入黑名单(联动认证授权模块的 IP 黑名单功能)
  • 期望:支持 IP 归属地显示、支持按时间范围导出、登录失败原因明确
  • 异常处理:如果失败记录来自多个不同 IP,可能是分布式攻击,需升级处理

场景3:API 错误排查——"这个接口为什么报错?"

  • 用户:运维工程师小陈
  • 背景:监控系统告警,某接口错误率突然飙升
  • 操作步骤
    1. 小陈进入「基础设施 → API 错误日志」页面
    2. 筛选条件:请求地址="/api/order/create",处理状态="未处理"
    3. 列表显示最近 20 条错误记录
    4. 点击第一条进入详情,看到:
      • 异常类名:NullPointerException
      • 异常位置:OrderServiceImpl.java:156
      • 异常堆栈:完整的调用链路
      • 请求参数:{userId: 10086, productId: null}
    5. 通过 traceId "abc123def456" 跳转到 API 访问日志,查看完整请求上下文
    6. 定位到根因:productId 参数为空导致空指针
    7. 通知开发修复,修复后将该日志标记为"已处理"
  • 期望:异常信息完整(堆栈+行号)、支持 traceId 关联、支持处理状态流转
  • 异常处理:如果同一异常大量重复出现,可以先标记为"已忽略"避免干扰,等开发统一修复

场景4:慢接口排查——"这个页面怎么加载这么慢?"

  • 用户:运维工程师小陈
  • 背景:用户反馈"项目列表页"打开要等 10 秒
  • 操作步骤
    1. 小陈进入「基础设施 → API 访问日志」页面
    2. 筛选条件:请求地址="/api/project/page",执行时长=">= 3000ms"
    3. 列表显示多条慢请求记录,执行时长在 3000-8000ms 之间
    4. 点击查看详情,发现请求参数中 pageSize=1000——用户一次拉了 1000 条数据
    5. 进一步分析发现该接口没有限制 pageSize 上限
    6. 通知开发增加分页大小限制,并优化查询性能
  • 期望:支持按执行时长筛选、展示完整请求参数和响应结果
  • 异常处理:如果慢请求集中在某个时间段,可能是数据库压力导致,需结合监控运维模块分析

场景5:季度合规审计——"把日志报告导出来"

  • 用户:安全审计员小赵
  • 背景:每季度需要向合规部门提交日志审计报告
  • 操作步骤
    1. 小赵分别进入登录日志、操作日志、API 错误日志页面
    2. 设置时间范围为"本季度"
    3. 逐个点击"导出 Excel"
    4. 整理三份 Excel 报告,附上统计摘要(登录次数、失败率、错误处理率等)
    5. 提交合规部门审查
  • 期望:导出格式规范、数据完整、支持大数量导出(最多 10 万条)
  • 异常处理:如果导出数量超过 10 万条,需缩小时间范围分批导出

场景6:安全审计——自动检测异常登录(P2 规划中)

  • 用户:安全审计员小赵
  • 背景:希望系统自动识别异常登录行为,而不是人工逐条查看
  • 操作步骤
    1. 系统自动运行安全审计规则,检测到以下异常:
      • 用户"zhangsan"在凌晨 3 点登录(非常规时间)
      • 用户"lisi"的账号从北京和上海两个城市同时登录(异地登录)
      • IP 203.0.113.50 在 5 分钟内尝试登录 15 次(暴力破解)
    2. 系统自动发送站内通知给安全审计员
    3. 小赵查看告警详情,确认暴力破解属实,将该 IP 加入黑名单
    4. 对小赵标记"异地登录"为误报(用户出差)
  • 期望:自动检测、自动告警、支持人工确认/排除

2.3 用户故事

编号用户故事优先级验收标准
US-01作为管理员,我希望查看登录日志列表,以便追溯用户登录行为P0① 支持按用户账号、IP、登录状态、时间范围筛选 ② 列表展示日志类型(登录/登出/注册)、用户账号、IP、浏览器、登录结果、时间 ③ 按时间倒序排列 ④ 分页查询响应 < 1s
US-02作为管理员,我希望导出登录日志,以便提交审计报告P1① 导出内容与当前筛选条件一致 ② Excel 格式,包含所有列表字段 ③ 最大支持 10 万条 ④ 需要 system:login-log:export 权限
US-03作为管理员,我希望查看操作日志及其详情,以便追溯数据变更P0① 支持按操作模块、操作名、操作人、时间范围筛选 ② 详情展示操作明细(如"将性别从男改成女")和扩展字段 ③ 用户编号自动翻译为昵称显示
US-04作为管理员,我希望导出操作日志,以便满足合规要求P1① 导出内容与筛选条件一致 ② 支持字典值翻译 ③ 需要 system:operate-log:export 权限
US-05作为运维人员,我希望查看 API 访问日志,以便监控接口性能P0① 支持按应用名、请求地址、执行时长、结果码筛选 ② 展示执行时长(毫秒级) ③ 详情包含完整请求参数和响应结果
US-06作为运维人员,我希望查看 API 错误日志,以便排查系统异常P0① 展示异常类名、异常消息、异常堆栈、出错位置(类名:行号) ② 支持按处理状态筛选 ③ 详情包含完整请求参数
US-07作为运维人员,我希望标记错误日志的处理状态,以便跟踪处理进度P1① 支持标记为"已处理"或"已忽略" ② 自动记录处理人和处理时间 ③ 需要 infra:api-error-log:update-status 权限
US-08作为安全审计员,我希望系统自动检测异常登录行为P2① 支持异地登录、暴力破解、非常规时间、新设备等检测规则 ② 检测到异常后自动发送通知 ③ 检测规则可配置
US-09作为安全审计员,我希望审计敏感操作记录P2① 标记高风险操作(批量删除、权限变更等) ② 支持查看敏感操作汇总报告
US-10作为运维人员,我希望通过 traceId 串联不同日志P0① 在错误日志详情中可通过 traceId 跳转到对应的访问日志 ② 在操作日志详情中可通过 traceId 跳转到访问日志 ③ 串联关系清晰可追溯

三、功能需求

3.1 后台管理端

3.1.1 功能清单

功能优先级说明
登录日志分页查询P0查看登录/登出/注册日志列表
登录日志详情P1查看单条登录日志完整信息
登录日志导出P1按筛选条件导出 Excel
操作日志分页查询P0查看操作日志列表
操作日志详情P0查看操作明细、扩展字段
操作日志导出P1按筛选条件导出 Excel
API 访问日志分页查询P0查看接口访问记录
API 访问日志详情P1查看请求参数、响应结果
API 访问日志导出P1按筛选条件导出 Excel
API 错误日志分页查询P0查看 API 异常记录
API 错误日志详情P0查看异常堆栈、定位信息
API 错误日志处理P1更新处理状态(已处理/已忽略)
API 错误日志导出P1按筛选条件导出 Excel
异常登录检测P2自动识别异地登录、暴力破解等异常
敏感操作审计P2标记和审计高危操作行为

3.1.2 登录日志

页面描述:

列表页展示所有登录/登出/注册记录。页面顶部是搜索区域,支持按用户账号(模糊匹配)、用户 IP(模糊匹配)、登录状态(成功/失败)、登录时间范围筛选。列表按时间倒序排列。

登录日志列表页原型

业务规则:

规则编号规则描述为什么这样设计
R-01用户登录成功/失败、登出、注册时自动记录日志,无需人工干预日志必须自动采集,不能依赖人工操作,否则会遗漏
R-02日志类型区分:100-登录、101-登出、200-注册区分不同事件类型,便于分类统计和筛选
R-03登录结果包含多种失败原因:0-成功、10-密码错误、11-手机验证码错误、12-邮箱验证码错误、20-用户被禁用、30-IP 黑名单细分失败原因有助于安全分析——密码错误可能是忘记密码,也可能是暴力破解
R-04记录用户 IP 地址,解析 UserAgent 获取浏览器和操作系统信息IP 用于追溯来源,UserAgent 用于识别设备类型,辅助安全判断
R-05日志默认保留 30 天,可通过系统配置调整保留策略平衡存储成本与审计需求,30 天覆盖大多数审计场景
R-06导出 Excel 最大支持 10 万条记录防止一次性导出过多数据导致系统卡顿或内存溢出
R-07登录日志按创建时间倒序排列最新日志在最前面,方便快速查看最近动态
R-08用户账号冗余存储(不随用户修改账号而变化)日志是历史记录,必须保留当时的账号信息,不能因为用户改名就丢失关联

数据字段:

字段名类型必填说明
idLong日志编号
logTypeInteger日志类型(100-登录、101-登出、200-注册)
traceIdString链路追踪编号(用于关联同一次请求的其他日志)
userIdLong用户编号(登录失败时可能为空,因为还没确认身份)
userTypeInteger用户类型(1-会员、2-管理员)
usernameString用户账号(冗余存储,防止账号修改后日志丢失关联)
resultInteger登录结果(0-成功、10-密码错误、11-手机验证码错误、12-邮箱验证码错误、20-用户被禁用、30-IP 黑名单)
userIpString用户 IP 地址
userAgentString浏览器 UserAgent(用于识别浏览器类型和操作系统)
createTimeDateTime登录时间

接口设计:

接口名称请求方式接口路径权限标识说明
获取登录日志详情GET/admin-api/system/login-log/getsystem:login-log:query获取单条登录日志
获取登录日志分页GET/admin-api/system/login-log/pagesystem:login-log:query分页查询登录日志
导出登录日志 ExcelGET/admin-api/system/login-log/export-excelsystem:login-log:export按筛选条件导出

请求参数(分页查询):

参数名类型必填说明
userIpString用户 IP(模糊匹配)
usernameString用户账号(模糊匹配)
statusBoolean登录状态(true-成功、false-失败)
createTimeDateTime[]登录时间范围
pageNoInteger页码(从 1 开始)
pageSizeInteger每页条数(默认 10)

返回结果(分页列表):

字段名类型说明
idLong日志编号
logTypeInteger日志类型
userIdLong用户编号
userTypeInteger用户类型
traceIdString链路追踪编号
usernameString用户账号
resultInteger登录结果
userIpString用户 IP
userAgentString浏览器 UA
createTimeDateTime登录时间

3.1.3 操作日志

页面描述:

列表页展示用户在系统中的关键操作记录。支持按操作模块、操作名、操作人、操作时间范围筛选。点击"查看详情"可看到完整的操作描述(如"修改编号为 1 的用户信息,将性别从男改成女")和扩展字段(JSON 格式的业务数据)。

操作日志列表页原型

详情弹窗:

操作日志详情弹窗原型

业务规则:

规则编号规则描述为什么这样设计
R-01通过 @OperateLog 注解自动记录操作日志,开发者在业务方法上标注即可统一采集方式,避免每个模块自己写日志逻辑,减少遗漏
R-02操作日志记录两级分类:操作模块类型(type,如"订单")和操作名(subType,如"修改订单")两级分类便于按模块汇总统计,也便于按具体操作精准查找
R-03操作明细(action)记录完整的操作描述,如"修改编号为 1 的用户信息,将性别从男改成女"用自然语言描述变更内容,非技术人员也能看懂
R-04扩展字段(extra)支持 JSON 格式,记录业务关键数据(如修改前后的值)不同业务需要记录的数据不同,JSON 格式灵活可扩展
R-05通过链路追踪编号(traceId)可关联 API 访问日志当操作日志不够排查问题时,可以通过 traceId 查看完整的请求和响应
R-06操作日志通过 userId 关联用户信息,列表展示时自动翻译为用户昵称管理员看昵称比看编号直观得多
R-07日志默认保留 30 天与登录日志保持一致的保留策略
R-08导出操作需要 system:operate-log:export 权限操作日志可能包含敏感业务数据,导出需要额外权限控制

数据字段:

字段名类型必填说明
idLong日志编号
traceIdString链路追踪编号
userIdLong用户编号
userTypeInteger用户类型
typeString操作模块类型(如"订单"、"用户")
subTypeString操作名(如"创建订单"、"修改用户")
bizIdLong操作模块业务编号
actionString操作明细(完整操作描述,自然语言)
extraString扩展字段(JSON 格式,记录业务关键数据)
requestMethodString请求方法(GET/POST/PUT/DELETE)
requestUrlString请求地址
userIpString用户 IP
userAgentString浏览器 UA
createTimeDateTime操作时间

接口设计:

接口名称请求方式接口路径权限标识说明
获取操作日志详情GET/admin-api/system/operate-log/getsystem:operate-log:query获取单条操作日志
获取操作日志分页GET/admin-api/system/operate-log/pagesystem:operate-log:query分页查询操作日志
导出操作日志 ExcelGET/admin-api/system/operate-log/export-excelsystem:operate-log:export按筛选条件导出

请求参数(分页查询):

参数名类型必填说明
userIdLong用户编号
bizIdLong操作模块业务编号
typeString操作模块(模糊匹配)
subTypeString操作名(模糊匹配)
actionString操作明细(模糊匹配)
createTimeDateTime[]操作时间范围
pageNoInteger页码(从 1 开始)
pageSizeInteger每页条数(默认 10)

返回结果(分页列表):

字段名类型说明
idLong日志编号
traceIdString链路追踪编号
userIdLong用户编号
userNameString用户昵称(自动翻译)
userTypeInteger用户类型
typeString操作模块类型
subTypeString操作名
bizIdLong操作模块业务编号
actionString操作明细
extraString扩展字段
requestMethodString请求方法
requestUrlString请求地址
userIpString用户 IP
userAgentString浏览器 UA
createTimeDateTime操作时间

3.1.4 API 访问日志

页面描述:

列表页展示每一次 API 请求的完整信息。支持按应用名、请求地址、执行时长(筛选慢接口)、结果码、时间范围筛选。

API访问日志列表页原型

💡 提示:上表中"执行时长 5200ms"那条记录标红高亮,提示运维人员关注慢接口。

业务规则:

规则编号规则描述为什么这样设计
R-01每次 API 请求自动记录访问日志,通过全局拦截器实现全量采集,不遗漏任何请求,开发者无需手动埋点
R-02记录完整的请求信息:请求方法、URL、参数、响应结果、执行时长完整信息是性能分析和问题排查的基础
R-03请求参数最大长度 8000 字符,超出部分截断防止超大请求体(如文件上传)撑爆数据库
R-04响应结果消息最大长度 512 字符,超出部分截断只记录结果消息,不记录完整响应体,控制存储量
R-05执行时长精确到毫秒毫秒级精度是性能分析的基本要求,能区分"正常"和"偏慢"
R-06应用名读取 spring.application.name 配置未来拆分微服务时,可以通过应用名区分不同服务的日志
R-07通过链路追踪编号(traceId)可串联操作日志和错误日志一次请求可能同时产生操作日志和错误日志,traceId 是串联的线索
R-08日志数据量大,默认保留 7 天(可通过配置调整)API 访问日志日均 50 万条,全量保留存储成本太高
R-09导出操作需要 infra:api-access-log:export 权限访问日志包含请求参数,可能含敏感数据

数据字段:

字段名类型必填说明
idLong日志编号
traceIdString链路追踪编号
userIdLong用户编号(未登录接口为空)
userTypeInteger用户类型
applicationNameString应用名(微服务名称)
requestMethodString请求方法(GET/POST/PUT/DELETE)
requestUrlString请求地址
requestParamsString请求参数(Query + Body,最大 8000 字符)
responseBodyString响应结果
userIpString用户 IP
userAgentString浏览器 UA
operateModuleString操作模块
operateNameString操作名
operateTypeInteger操作分类(1-查询、2-新增、3-修改、4-删除、5-导出、6-导入)
beginTimeDateTime开始请求时间
endTimeDateTime结束请求时间
durationInteger执行时长(毫秒)
resultCodeInteger结果码(0-成功,其他-失败)
resultMsgString结果提示(最大 512 字符)
createTimeDateTime创建时间

接口设计:

接口名称请求方式接口路径权限标识说明
获取 API 访问日志详情GET/admin-api/infra/api-access-log/getinfra:api-access-log:query获取单条访问日志
获取 API 访问日志分页GET/admin-api/infra/api-access-log/pageinfra:api-access-log:query分页查询访问日志
导出 API 访问日志 ExcelGET/admin-api/infra/api-access-log/export-excelinfra:api-access-log:export按筛选条件导出

请求参数(分页查询):

参数名类型必填说明
userIdLong用户编号
userTypeInteger用户类型
applicationNameString应用名(模糊匹配)
requestUrlString请求地址(模糊匹配)
durationInteger执行时长下限(毫秒),筛选 >= 该值的记录
resultCodeInteger结果码
beginTimeDateTime[]请求时间范围
pageNoInteger页码(从 1 开始)
pageSizeInteger每页条数(默认 10)

返回结果(分页列表):

字段名类型说明
idLong日志编号
traceIdString链路追踪编号
userIdLong用户编号
userTypeInteger用户类型
applicationNameString应用名
requestMethodString请求方法
requestUrlString请求地址
requestParamsString请求参数
responseBodyString响应结果
userIpString用户 IP
userAgentString浏览器 UA
operateModuleString操作模块
operateNameString操作名
operateTypeInteger操作分类
beginTimeDateTime开始请求时间
endTimeDateTime结束请求时间
durationInteger执行时长(毫秒)
resultCodeInteger结果码
resultMsgString结果提示
createTimeDateTime创建时间

3.1.5 API 错误日志

页面描述:

列表页展示 API 异常记录。支持按应用名、请求地址、异常时间范围、处理状态筛选。列表展示异常名、异常消息、处理状态等关键信息。

API错误日志列表页原型

详情页面(含处理操作):

API错误日志详情对话框

业务规则:

规则编号规则描述为什么这样设计
R-01API 请求发生异常时自动记录错误日志,由全局异常处理器触发自动采集,开发者无需手动记录,确保不遗漏任何异常
R-02记录完整的异常信息:异常类名、异常消息、根异常消息、堆栈轨迹、异常发生的类/方法/行号完整的异常信息是开发定位 Bug 的关键,尤其是行号可以直接定位代码位置
R-03请求参数最大长度 8000 字符,超出部分截断与 API 访问日志保持一致,防止超大参数撑爆存储
R-04处理状态枚举:0-未处理、1-已处理、2-已忽略三态设计覆盖所有场景——有些错误需要修复,有些是已知问题可以忽略
R-05更新处理状态时自动记录处理人(当前登录用户)和处理时间责任到人,避免"我以为别人处理了"的情况
R-06通过链路追踪编号(traceId)可关联对应的 API 访问日志错误日志只有异常信息,关联访问日志可以看到完整的请求上下文
R-07日志默认保留 90 天错误日志量不大(日均约 1000 条),保留更长时间有助于发现周期性 Bug
R-08更新处理状态需要 infra:api-error-log:update-status 权限处理状态是问题跟踪的依据,不能随意修改

数据字段:

字段名类型必填说明
idLong日志编号
traceIdString链路追踪编号
userIdLong用户编号
userTypeInteger用户类型
applicationNameString应用名
requestMethodString请求方法
requestUrlString请求地址
requestParamsString请求参数(最大 8000 字符)
userIpString用户 IP
userAgentString浏览器 UA
exceptionTimeDateTime异常发生时间
exceptionNameString异常类全名(如 java.lang.NullPointerException
exceptionMessageString异常消息
exceptionRootCauseMessageString根异常消息(嵌套异常的最底层原因)
exceptionStackTraceString异常堆栈轨迹(完整堆栈)
exceptionClassNameString异常发生的类全名
exceptionFileNameString异常发生的类文件名
exceptionMethodNameString异常发生的方法名
exceptionLineNumberInteger异常发生的方法行号
processStatusInteger处理状态(0-未处理、1-已处理、2-已忽略)
processTimeDateTime处理时间
processUserIdLong处理用户编号
createTimeDateTime创建时间

接口设计:

接口名称请求方式接口路径权限标识说明
获取 API 错误日志详情GET/admin-api/infra/api-error-log/getinfra:api-error-log:query获取单条错误日志
获取 API 错误日志分页GET/admin-api/infra/api-error-log/pageinfra:api-error-log:query分页查询错误日志
更新错误日志处理状态PUT/admin-api/infra/api-error-log/update-statusinfra:api-error-log:update-status标记处理状态
导出 API 错误日志 ExcelGET/admin-api/infra/api-error-log/export-excelinfra:api-error-log:export按筛选条件导出

请求参数(分页查询):

参数名类型必填说明
userIdLong用户编号
userTypeInteger用户类型
applicationNameString应用名(模糊匹配)
requestUrlString请求地址(模糊匹配)
exceptionTimeDateTime[]异常发生时间范围
processStatusInteger处理状态(0-未处理、1-已处理、2-已忽略)
pageNoInteger页码(从 1 开始)
pageSizeInteger每页条数(默认 10)

请求参数(更新处理状态):

参数名类型必填说明
idLong错误日志编号
processStatusInteger处理状态(1-已处理、2-已忽略)

返回结果(更新处理状态):

字段名类型说明
dataBoolean操作结果(true-成功)

3.1.6 安全审计(P2 规划中)

以下功能为 P2 优先级,计划在核心日志功能完成后迭代开发。

3.1.6.1 异常登录检测

功能描述:

基于登录日志数据,自动识别异常登录行为并生成告警。就像小区的安保系统——不仅记录谁进了门,还会自动发现可疑人员。

检测规则:

规则编号规则名称检测逻辑告警级别通俗解释
SR-01异地登录检测同一用户短时间内 IP 归属地发生跨省变化10 分钟前在北京登录,现在就从上海登录了——账号可能被盗
SR-02暴力破解检测同一 IP 在 5 分钟内登录失败超过 10 次有人在疯狂尝试密码,大概率是攻击行为
SR-03频繁失败检测同一用户在 1 小时内登录失败超过 5 次用户自己一直输错密码,可能需要帮助重置
SR-04非常规时间登录用户在凌晨 0:00-6:00 期间登录半夜登录不一定有问题,但值得关注
SR-05新设备登录用户使用了从未出现过的 UserAgent 登录可能换了手机或电脑,也可能是别人在用

告警方式:

告警渠道说明实现方式
站内通知推送给系统管理员和安全审计员联动消息通知模块
邮件通知发送给安全审计员邮箱联动消息通知模块的邮件发送能力
3.1.6.2 敏感操作审计

功能描述:

标记系统中高风险操作,支持查看敏感操作汇总报告。就像银行的高柜业务——某些操作需要额外审批和记录。

敏感操作类型:

操作类型示例风险等级为什么高风险
批量删除批量删除用户、角色误操作影响面大,且难以恢复
权限变更修改角色权限、分配管理员可能导致权限泄露或越权
数据导出导出用户列表、导出日志可能泄露敏感数据
系统配置变更修改系统参数、修改安全策略影响全局,可能导致系统异常
账号操作重置密码、锁定/解锁账号可能被用于社会工程攻击

四、非功能需求

4.1 性能要求

指标要求说明
登录日志分页查询< 1s(30 天内数据)登录日志量较小,查询应快速
操作日志分页查询< 1s(30 天内数据)操作日志量中等,需索引优化
API 访问日志分页查询< 1s(当日数据)访问日志量大(日均 50 万),需限制查询时间范围
API 错误日志分页查询< 1s(90 天内数据)错误日志量小,查询应快速
日志导出(10 万条)< 30s异步生成文件,避免阻塞页面
日志写入延迟< 100ms异步写入,不影响业务接口响应速度
日志对业务接口性能影响< 5%日志是辅助功能,不能拖慢核心业务

4.2 数据量预估

日志类型日均数据量月均数据量默认保留天数存储策略
登录日志~1 万条~30 万条30 天到期自动归档到冷存储
操作日志~5 万条~150 万条30 天到期自动归档到冷存储
API 访问日志~50 万条~1500 万条7 天量大,短保留 + 定期归档
API 错误日志~1 千条~3 万条90 天量小,长保留便于排查

💡 存储估算:以 MySQL 为例,API 访问日志每条约 2KB,日均 50 万条 ≈ 1GB/天,7 天 ≈ 7GB。建议生产环境配置定时任务自动清理过期数据。

4.3 安全要求

要求说明实现方式
日志不可篡改日志写入后不支持修改和删除(错误日志仅支持标记处理状态)不提供删除接口,数据库层面限制 UPDATE/DELETE
敏感信息脱敏请求参数中的密码、Token 等敏感字段需脱敏存储在日志写入前对敏感字段做掩码处理(如 ***
访问权限控制日志查看和导出需要对应权限基于 RBAC 权限体系,每个操作都有独立的权限标识
日志传输加密日志数据传输使用 HTTPS 加密全站 HTTPS
操作留痕日志导出操作本身也记录操作日志导出接口标注 @OperateLog 注解

4.4 可用性要求

要求说明
日志记录不阻塞业务日志写入采用异步方式(线程池 + 消息队列),业务接口无需等待日志写入完成
日志写入容错日志写入失败不影响业务接口正常执行——日志是辅助功能,不能因为日志出错导致业务中断
大数据量查询优化支持分页查询、索引优化,避免全表扫描;对超大时间范围查询做限制

五、数据设计

5.1 数据模型

登录日志表(system_login_log)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT日志主键
log_typeTINYINTNOT NULL日志类型(100-登录、101-登出、200-注册)
trace_idVARCHAR(64)-链路追踪编号
user_idBIGINT-用户编号(登录失败时可能为空)
user_typeTINYINTNOT NULL用户类型(1-会员、2-管理员)
usernameVARCHAR(50)NOT NULL用户账号(冗余存储)
resultTINYINTNOT NULL登录结果(0-成功、10-密码错误、11-手机验证码错误、12-邮箱验证码错误、20-用户被禁用、30-IP 黑名单)
user_ipVARCHAR(50)-用户 IP 地址
user_agentVARCHAR(512)-浏览器 UserAgent
tenant_idBIGINTNOT NULL租户编号
creatorVARCHAR(64)-创建者
create_timeDATETIMENOT NULL创建时间
updaterVARCHAR(64)-更新者
update_timeDATETIMENOT NULL更新时间
deletedBIT(1)NOT NULL, DEFAULT 0删除标记

索引设计:

索引名字段类型说明
idx_usernameusername普通索引按用户账号查询
idx_user_ipuser_ip普通索引按 IP 查询(排查暴力破解)
idx_resultresult普通索引按登录结果筛选失败记录
idx_create_timecreate_time普通索引按时间范围查询
idx_tenant_createtenant_id, create_time联合索引租户 + 时间范围查询(最常用组合)

操作日志表(system_operate_log)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT日志主键
trace_idVARCHAR(64)-链路追踪编号
user_idBIGINT-用户编号
user_typeTINYINT-用户类型
typeVARCHAR(50)-操作模块类型(如"订单"、"用户")
sub_typeVARCHAR(50)-操作名(如"创建订单")
biz_idBIGINT-操作模块业务编号
actionTEXT-操作明细(完整操作描述)
extraVARCHAR(2000)-扩展字段(JSON 格式)
request_methodVARCHAR(16)-请求方法
request_urlVARCHAR(512)-请求地址
user_ipVARCHAR(50)-用户 IP
user_agentVARCHAR(512)-浏览器 UA
tenant_idBIGINTNOT NULL租户编号
creatorVARCHAR(64)-创建者
create_timeDATETIMENOT NULL创建时间
updaterVARCHAR(64)-更新者
update_timeDATETIMENOT NULL更新时间
deletedBIT(1)NOT NULL, DEFAULT 0删除标记

索引设计:

索引名字段类型说明
idx_user_iduser_id普通索引按用户查询操作记录
idx_typetype普通索引按操作模块查询
idx_biz_idbiz_id普通索引按业务编号精准查询
idx_create_timecreate_time普通索引按时间范围查询
idx_tenant_createtenant_id, create_time联合索引租户 + 时间范围查询

API 访问日志表(infra_api_access_log)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT日志主键
trace_idVARCHAR(64)-链路追踪编号
user_idBIGINT-用户编号
user_typeTINYINT-用户类型
application_nameVARCHAR(50)-应用名
request_methodVARCHAR(16)-请求方法
request_urlVARCHAR(512)-请求地址
request_paramsTEXT-请求参数(最大 8000 字符)
response_bodyTEXT-响应结果
user_ipVARCHAR(50)-用户 IP
user_agentVARCHAR(512)-浏览器 UA
operate_moduleVARCHAR(50)-操作模块
operate_nameVARCHAR(50)-操作名
operate_typeINT-操作分类
begin_timeDATETIME-开始请求时间
end_timeDATETIME-结束请求时间
durationINT-执行时长(毫秒)
result_codeINT-结果码
result_msgVARCHAR(512)-结果提示
tenant_idBIGINTNOT NULL租户编号
creatorVARCHAR(64)-创建者
create_timeDATETIMENOT NULL创建时间
updaterVARCHAR(64)-更新者
update_timeDATETIMENOT NULL更新时间
deletedBIT(1)NOT NULL, DEFAULT 0删除标记

索引设计:

索引名字段类型说明
idx_user_iduser_id普通索引按用户查询
idx_request_urlrequest_url(191)普通索引按请求地址查询(前缀索引,兼容 utf8mb4)
idx_durationduration普通索引按执行时长筛选慢接口
idx_result_coderesult_code普通索引按结果码筛选
idx_begin_timebegin_time普通索引按请求时间查询
idx_tenant_begintenant_id, begin_time联合索引租户 + 时间范围查询

API 错误日志表(infra_api_error_log)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT日志主键
trace_idVARCHAR(64)-链路追踪编号
user_idBIGINT-用户编号
user_typeTINYINT-用户类型
application_nameVARCHAR(50)-应用名
request_methodVARCHAR(16)-请求方法
request_urlVARCHAR(512)-请求地址
request_paramsTEXT-请求参数(最大 8000 字符)
user_ipVARCHAR(50)-用户 IP
user_agentVARCHAR(512)-浏览器 UA
exception_timeDATETIME-异常发生时间
exception_nameVARCHAR(128)-异常类全名
exception_messageTEXT-异常消息
exception_root_cause_messageTEXT-根异常消息
exception_stack_traceTEXT-异常堆栈轨迹
exception_class_nameVARCHAR(256)-异常发生的类全名
exception_file_nameVARCHAR(256)-异常发生的类文件名
exception_method_nameVARCHAR(256)-异常发生的方法名
exception_line_numberINT-异常发生的方法行号
process_statusTINYINTNOT NULL, DEFAULT 0处理状态(0-未处理、1-已处理、2-已忽略)
process_timeDATETIME-处理时间
process_user_idBIGINT-处理用户编号
tenant_idBIGINTNOT NULL租户编号
creatorVARCHAR(64)-创建者
create_timeDATETIMENOT NULL创建时间
updaterVARCHAR(64)-更新者
update_timeDATETIMENOT NULL更新时间
deletedBIT(1)NOT NULL, DEFAULT 0删除标记

索引设计:

索引名字段类型说明
idx_user_iduser_id普通索引按用户查询
idx_request_urlrequest_url(191)普通索引按请求地址查询
idx_exception_timeexception_time普通索引按异常时间查询
idx_process_statusprocess_status普通索引按处理状态筛选未处理记录
idx_tenant_processtenant_id, process_status联合索引租户 + 处理状态查询

5.2 数据字典

字典类型字典标识字典值说明
登录日志类型system_login_log_type100-登录、101-登出、200-注册登录日志的事件类型
登录结果system_login_result0-成功、10-账号密码错误、11-手机验证码错误、12-邮箱验证码错误、20-用户被禁用、30-IP 黑名单登录/登出的结果
用户类型system_user_type1-会员、2-管理员用户类型
操作分类infra_operate_type1-查询、2-新增、3-修改、4-删除、5-导出、6-导入API 操作分类
API 错误处理状态infra_api_error_process_status0-未处理、1-已处理、2-已忽略API 错误日志的处理状态

5.3 处理状态流转

API 错误日志的处理状态遵循以下流转规则:

错误日志处理状态流转图

  • 未处理 → 已处理:运维/开发人员确认问题已修复
  • 未处理 → 已忽略:确认为已知问题或误报,暂不处理
  • 处理时自动记录:处理人(当前登录用户)+ 处理时间

六、跨模块联动

6.1 联动关系总览

日志审计作为基础模块,与多个模块存在数据交互或功能依赖:

关联模块联动方式联动内容优先级
认证授权数据写入登录/登出/注册事件触发登录日志写入;IP 黑名单拦截时记录日志P0
用户管理数据读取操作日志通过 userId 读取用户昵称展示;登录日志通过 userId 关联用户信息P0
租户管理数据隔离所有日志按 tenant_id 隔离,查询时自动过滤当前租户P0
角色权限权限控制日志查看和导出操作受 RBAC 权限控制P0
消息通知告警推送P2 安全审计检测到异常后,通过消息通知模块发送站内信/邮件告警P2
工作流操作记录工作流审批操作通过 @OperateLog 注解记录到操作日志P0
支付模块操作记录支付相关操作(退款、调账等)通过 @OperateLog 记录到操作日志P0
监控运维数据共享API 访问日志的性能数据可被监控运维模块引用,生成性能报表P1

6.2 关键联动流程

6.2.1 登录日志自动采集流程

登录日志自动采集流程图

6.2.2 操作日志自动采集流程

操作日志自动采集流程图

6.2.3 traceId 串联查询流程

TraceId串联查询流程图

6.3 数据一致性要求

场景一致性要求实现方式
登录日志写入最终一致异步写入,允许极小延迟,但必须保证写入成功(失败重试)
操作日志写入最终一致异步写入,业务操作成功但日志写入失败时,通过补偿机制重试
错误日志处理状态强一致同步更新,处理状态变更立即生效
日志不可篡改强一致数据库层面限制,不提供物理删除接口

七、附录

7.1 名词解释

术语通俗解释在系统中的角色
日志审计就像飞机的"黑匣子",记录系统中发生的一切关键事件本模块的名称,涵盖日志的记录、查询、导出、分析
TraceId(链路追踪编号)就像快递单号,一次请求不管经过多少个环节,凭这个单号都能查到串联同一次请求产生的所有日志(登录日志、操作日志、访问日志、错误日志)
登录日志就像小区门禁的刷卡记录记录谁在什么时间、从哪里登录了系统
操作日志就像办公室的监控录像记录用户在系统里做了什么操作(新建、修改、删除等)
API 访问日志就像高速公路收费站的过车记录记录每一次接口调用的详细信息(请求参数、响应结果、执行时长)
API 错误日志就像设备的故障报警单记录接口出错时的完整信息(异常类型、堆栈、出错位置)
UserAgent(浏览器标识)就像身份证上的"民族"字段,标识你用什么设备访问系统用于识别用户的浏览器类型和操作系统
@OperateLog 注解就像给摄像头贴标签——告诉系统"这个操作需要被记录"开发者在代码中标注此注解,系统就会自动记录操作日志
处理状态就像工单的"待处理/已处理/已关闭"状态错误日志的生命周期管理,确保每个错误都有人跟进
异步写入就像你把信投进邮筒就可以走了,不用等邮递员上门日志写入在后台进行,不阻塞用户的操作
日志归档就像把旧文件从办公桌搬到档案室将过期日志从主库转移到冷存储,释放空间但保留数据
暴力破解就像小偷一把一把地试钥匙攻击者通过大量尝试密码来破解账号
IP 归属地就像电话区号能告诉你对方是哪个城市的通过 IP 地址解析出地理位置(省/市),用于安全分析
敏感信息脱敏就像在快递单上隐藏手机号中间四位将密码、Token 等敏感数据替换为 ***,防止泄露
数据字典就像代码本——把数字翻译成人类能懂的文字把登录结果"10"翻译成"账号密码错误",方便理解

7.2 权限配置

权限标识权限名称说明建议分配角色
system:login-log:query查看登录日志查看登录日志列表和详情系统管理员、安全审计员
system:login-log:export导出登录日志导出登录日志 Excel系统管理员、安全审计员
system:operate-log:query查看操作日志查看操作日志列表和详情系统管理员
system:operate-log:export导出操作日志导出操作日志 Excel系统管理员、安全审计员
infra:api-access-log:query查看 API 访问日志查看 API 访问日志列表和详情运维工程师、开发人员
infra:api-access-log:export导出 API 访问日志导出 API 访问日志 Excel运维工程师
infra:api-error-log:query查看 API 错误日志查看 API 错误日志列表和详情运维工程师、开发人员
infra:api-error-log:update-status处理 API 错误日志更新 API 错误日志的处理状态运维工程师、开发人员
infra:api-error-log:export导出 API 错误日志导出 API 错误日志 Excel运维工程师

7.3 接口汇总

接口组接口数量接口路径前缀说明
登录日志3/admin-api/system/login-log详情、分页、导出
操作日志3/admin-api/system/operate-log详情、分页、导出
API 访问日志3/admin-api/infra/api-access-log详情、分页、导出
API 错误日志4/admin-api/infra/api-error-log详情、分页、更新状态、导出
合计13

7.4 变更记录

版本日期修改内容修改人
v1.02026-09-16初始版本,包含登录日志、操作日志、API 访问日志、API 错误日志、安全审计规划PM Team
v2.02026-09-19全面增强:① 增加 6 个详细用户场景(含命名角色和异常处理)② 用户故事增加可量化验收标准 ③ 新增 ASCII 页面原型 ④ 业务规则增加设计理由 ⑤ 新增跨模块联动章节(含 3 个关键流程图)⑥ 新增名词解释(15 个术语+通俗类比)⑦ 新增处理状态流转图 ⑧ 接口汇总和权限配置优化PM Team

本文档为日志审计模块 PRD v2.0,如有问题请联系产品负责人。