5.14 操作日志
概述
操作日志由中间件异步采集:gmeta log/logType 标签声明记录内容,OperationLog 中间件组装(含脱敏),有界通道 + 单 worker 批量落库,绝不阻塞业务。41 种日志类型固定枚举。
采集链路
text
gmeta log 标签 → 路由元数据(meta 表)→ 中间件组装 OperationLogEntry
→ 有界通道 2048(满则丢弃并计数告警,不阻塞业务)
→ 单 worker 攒批(满 100 条或每 1s flush 一批)
→ LogSink(operation_log 模块 init 注册的落库函数)
→ INSERT goframe_operation_log记录字段
text
Title=log 标签 Type=logType Source=0
Method="GET /api/user/page"(路由模板) RequestMethod/URL=实际请求
Param:GET/DELETE 取 query JSON;写操作优先取 body
(maskSecret 脱敏 password/oldPassword/newPassword/salt/
access_token/refresh_token → ***)
Result:响应信封 JSON(截断 8000 字节,UTF-8 边界回退截断)
IP=realClientIP Location=ip2region OS/Browser=ua 解析
ConsumeTime=毫秒 Status:响应 code==0 → 0 正常,否则 1 异常(Error=msg)
CreateUser=ctx 用户名log_type 固定枚举(consts/log_type.go,数值勿改)
text
0=自动推断(GET→查询,其余→修改)
1=新增 2=修改 3=删除 4=查询 5=导入 6=导出
7=审批 8=驳回 9=提交 10=撤回 11=关闭 12=开启
13=启用 14=禁用 15=上传 16=下载 17=发送 18=同步
19=代码生成 20=清空 21=还原 22=登录 23=登出 24=重置
25=分配 26=授权 27=执行 28=暂停 29=恢复 30=发布
31=下架 32=复制 33=移动 34=排序 35=锁定 36=解锁
37=归档 38=取消归档 39=绑定 40=解绑 99=其他gmeta logType 字符串(query/add/update/delete/import/export/reset/…)经 LogTypeMap 转枚举;展示中文经 LogTypeNames(logic 的 LogTypeText)——该字段不走字典(数值与注解绑定,改动破坏存量日志)。
开关与配置
yaml
operationLog:
enable: true # 总开关
logQuery: true # 是否记录查询类操作(logType=query)日志标题约定:{模块中文名}-{动作}(如"用户管理-查询分页记录"),动作映射 page=查询分页记录 / list=查询列表 / detail=查询详情 / add=新增记录 / update=修改记录 / delete=删除记录 / batchDelete=批量删除记录 / import=导入数据 / export=导出数据 / status=设置状态。
查询模块(/api/oper/log)
text
仅查询与删除(无增改——日志只能系统写入):
GET /api/oper/log/page|list|detail/:id
DELETE /api/oper/log/delete/:id | /batchDelete
权限:sys:operLog:{page|list|detail|delete|batchDelete}
清理:内置 LogClean 定时任务物理删除超保留期记录(job.logRetentionDays 默认 90 天)可靠性设计
| 场景 | 行为 |
|---|---|
| 通道满(2048) | 丢弃该条并计数,每丢 100 条输出一次 Warning——日志绝不阻塞业务 |
| 落库失败 | 仅记错误日志,不影响响应 |
| panic | Response 中间件 recover 兜底(日志采集在 defer 后仍执行) |
| 批量节奏 | 满 100 条或 1s flush——峰值下落库延迟 ≤1s |
排障
text
日志完全缺失:operationLog.enable=false?LogSink 未注册(启动告警)?
查询类没记录:operationLog.logQuery=false
偶发缺失:通道满丢弃告警(看 Warning 日志);峰值场景可调大通道容量
Param 是 ***:正常——敏感字段脱敏
Result 超长被截:正常——截断 8KB
IP/归属地不对:api.proxyIps 未含反代地址(见受信代理机制)