================================================================================ EasyGoAdmin 后端开发者文档 · 06 监控体系与在线用户 ================================================================================ monitor 域共 7 个模块:operation_log、login_log、job、job_log(四张表)+ online_user、server_monitor、cache_monitor(三个无表模块)。 job/job_log 的调度机制见 09 章;本章聚焦监控与在线用户。 -------------------------------------------------------------------------------- 1. 在线用户(logic/online_user.go,无表,数据源 Redis) -------------------------------------------------------------------------------- 1.1 数据结构(见 03 章第 10 节) zset easygoadmin:online:jti:set score = 访问令牌过期时间戳 键 easygoadmin:online:info:{jti} JSON 详情(TTL = access 剩余期 + 60s) onlineInfo 字段:jti/userId/username/realname/ip/location/oss/browser/ loginTime/issuedAt/expireAt/refreshJti/refreshIssuedAt/refreshExpireAt/ accessToken/refreshToken(令牌原文,仅详情查看返回)/tokenType/expiresIn 1.2 登记与注销 MarkOnline(登录成功、refresh 轮换后调用):写详情键 + ZAdd zset。 MarkOffline(登出、强退后调用):ZRem + Del。 过期令牌由 zset score 区间过滤自然淘汰(查询只取 score ≥ now 的成员)。 1.3 接口 GET /api/onlineUser/page perm sys:onlineUser:page 流程:ZRangeByScore(now..+∞) → 逐 jti 读详情 → username/ip 子串过滤 → 按登录时间倒序 → 同用户多会话标注(SessionNo/Sessions 序号与总数) → 批量回填头像(按 userId 查 user.avatar,GetFileUrl 补域名,单用户只查一次) → 内存分页(NewPageData)。 GET /api/onlineUser/detail/:id perm sys:onlineUser:detail 按 jti 返回完整信息(含令牌原文)。 GET /api/onlineUser/forceLogout/:id perm sys:onlineUser:forceLogout 单会话强退:access jti 拉黑(TTL=剩余期+60s)+ refresh jti 一并拉黑 (防被踢会话经 refresh 换新令牌复活)+ MarkOffline。 GET /api/onlineUser/forceLogoutUser/:userId 同权限 踢出该用户全部设备:遍历 zset 匹配 userId,逐会话双令牌拉黑 + 注销。 1.4 无心跳/续期机制:会话有效期即 access 令牌有效期(2h); 前端 refresh 轮换会刷新在线登记(MarkOnline 覆盖写)。 1.5 在线会话生命周期图 登录/refresh 成功 │ MarkOnline ▼ ┌─────────────────────────────────────────────┐ │ zset easygoadmin:online:jti:set │ score=access过期ts │ 键 easygoadmin:online:info:{jti} = JSON │ TTL=access剩余+60s └──────────────────┬──────────────────────────┘ 页面访问(有效期内)│ │登出 Logout / 强退 ForceLogout (token 有效,│ ▼ MarkOffline + access/refresh 双拉黑 JWT 放行) │ zset 移除 + info 删除 → 会话消失 ▼ access 到期:zset score < now 被区间过滤(列表不可见); info 键 TTL 到期自动清除 refresh 到期:无法再换新令牌 查询视图(Page)= zset(score≥now) × info 详情 × username/ip 过滤 × 内存分页 -------------------------------------------------------------------------------- 2. 服务器监控(logic/server_monitor.go + server_monitor_windows/other.go) -------------------------------------------------------------------------------- GET /api/server/info(登录即可,log "服务器监控-查询信息") 返回 ServerInfoRes: Server hostname / goVersion / arch / numCPU / goroutines / uptime (procStart 为包加载时刻) Mem allocMB / totalAllocMB / sysMB / heapAllocMB / heapSysMB / heapObjects / gccycles(runtime.ReadMemStats,MB 保留两位小数) Disk 平台分支实现: windows(//go:build windows):GetDiskFreeSpaceEx 读工作目录所在盘符 (wd[:3] 如 "E:\"),返回 totalGB/freeGB/usedPercent other(!windows):syscall.Statfs Db SELECT VERSION() 计时(pingMs)+ 版本号;数据库不通不视为整体失败 (版本留空,err 置 nil 返回) Cache cache.UsingMemory() → {mode:"memory", connected:false} 否则 Redis PING → {mode:"redis", connected:true/false} Scheduler 调度器健康:统计 gcron 中 "job:" 前缀条目数(mounted)与 goframe_job status=1 计数(expected);enabled=DaemonInit 已执行; healthy = mounted >= expected(挂载失败或数据被外部改动会出现差值) -------------------------------------------------------------------------------- 3. 缓存监控(logic/cache_monitor.go,无表) -------------------------------------------------------------------------------- GET /api/cache/info(登录即可,log "缓存监控-查询信息") 内存降级(cache.UsingMemory())→ {mode:"memory", connected:false},仅返回模式标识。 Redis 模式:依次 INFO server/memory/stats/clients/keyspace + DBSIZE, 解析(parseRedisInfo:# 注释行跳过,k:v 映射): version / uptime / usedMemory / usedMemoryPeak / maxMemory / fragRatio / connectedClients / expiredKeys / evictedKeys / totalCommands / totalConns / hits / misses / hitRate(hits/(hits+misses),两位小数)/ keys(DBSIZE)/ keySpace[](每 db 的 keys/expires) 任一 INFO 失败 → connected=false 返回已解析部分。 -------------------------------------------------------------------------------- 4. 操作日志(表 goframe_operation_log,采集见 02 章) -------------------------------------------------------------------------------- 4.1 写入:中间件异步批量落库(LogSink),记录 Title/Type/Method/URL/Param(脱敏)/ Result(截断 8KB)/IP/Location/OS/Browser/ConsumeTime/Status/Error/CreateUser。 4.2 查询模块(/api/oper/log,仅 page/list/detail/delete/batchDelete,无增改): perm sys:operLog:{page|list|detail|delete|batchDelete}。 4.3 log_type 固定枚举(consts/log_type.go,前端按此映射显示,数值勿改): 0=自动推断 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 字符串 → 枚举经 LogTypeMap;展示中文经 LogTypeNames (logic 的 LogTypeText,该字段不走字典)。 4.4 清理:内置 LogClean 定时任务物理删除超保留期记录(见 09 章)。 -------------------------------------------------------------------------------- 5. 登录日志(表 goframe_login_log,业务写入) -------------------------------------------------------------------------------- 写入方:logic/auth.go writeLoginLog——登录成功/失败(log_type=1, 失败 status=1 存 error,code 脱敏 ***)、退出(log_type=2)。 记录字段:username/log_type/source(0 后台)/method/request_method/url/param/ result(成功|失败)/ip/location(ip2region)/os/browser/consume_time/status/error。 查询模块:/api/login/log(page/list/detail/delete/batchDelete), perm sys:loginLog:*;同样受 LogClean 清理。 -------------------------------------------------------------------------------- 6. 任务日志(表 goframe_job_log) -------------------------------------------------------------------------------- 写入方:调度器 executeJob 每次执行后写入(create_user="daemon"): job_id/job_name/job_group/job_trigger/job_message/cron_expression/status (0 成功 1 失败)/start_time/end_time/consume_time(毫秒)/exception_info 查询模块:/api/job/log(page/list/detail/delete/batchDelete),perm sys:jobLog:*。 -------------------------------------------------------------------------------- 7. 监控相关配置与运维入口 -------------------------------------------------------------------------------- operationLog.enable / operationLog.logQuery 操作日志开关(见 02 章) job.logRetentionDays(默认 90) 三张日志表保留天数(LogClean 消费) ip2region.path 归属地库路径 api.proxyIps 受信代理(影响 IP 与归属地准确性) 运维排障速查: 调度器异常 GET /api/job/daemonStatus(running/jobIds/startTime) GET /api/server/info 的 Scheduler 字段(mounted vs expected) 缓存降级 GET /api/cache/info mode=memory(Redis 不可用,限流/锁退化单机) 在线人数 GET /api/onlineUser/page total 日志缺失 检查 operationLog.enable、通道满丢弃告警日志、LogSink 是否注册