API 访问与异常日志
核验日期:2026-09-18。证据级别:当前源码静态核验 + 测试环境统一只读元数据采集。
物理类型、可空性、默认值、完整索引及约束见 MySQL 实测字典;源码与实库差异见 infra 总览。
infra 集中保存各应用上 报的访问与异常日志,application_name 记录来源应用;跨服务上报并不表示每个服务各有一份日志表。
返回 infra 总览。以下列名为 MyBatis 映射或显式 SQL 预期,类型栏是 Java 类型,不推断数据库长度、默认值及可空性;所有 BaseDO 子类均包含总览所列五个继承字段。
业务流程与读写职责
业务服务上报日志后,ApiAccessLogServiceImpl 先保存请求、结果、耗时及操作者,再留存附件并回填 file_ids。管理端按应用、用户、URL、时间定位操作,用 trace_id 进一步关联异常。异常表保留堆栈定位字段,并用 process_status/process_time/process_user_id 管理处理闭环;访问日志 result_code 不能替代处理状态。历史清理的分批物理 DELETE 与普通软删除不同。
关系与存储规则
trace_id关联访问日志、异常日志和链路日志;user_id + user_type表示操作者来源,process_user_id表示异常处理人,均为逻辑关系。- 访问日志
file_ids用 JacksonTypeHandler 序列化为 JSON 数组,引用infra_file.id,保留已删除附件 ID;不是独立附件关系表。 - ApiAccessLogServiceImpl:52 对 request_params 限长 8000;结果提示上限 512 定义于 ApiAccessLogDO:40。服务限长不等于物理 VARCHAR 长度。附 件在日志建立后回填(ApiAccessLogServiceImpl:66)。
- 两个 Mapper 都有按 create_time 分批物理清理的 DELETE(ApiAccessLogMapper:44、ApiErrorLogMapper:41),不能把所有删除都描述为软删除。
- 日志上报来源属于所有调用方;本整理不读取 request_params、response_body、异常堆栈或附件内容。
infra_api_access_log
源码:ik_project/yudao-cloud/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiAccessLogDO.java:46。
继承:BaseDO(五个审计/软删除字段见下表末尾)。主键候选为 id(实体主键注解或 MyBatis 约定);二级索引、唯一性和物理外键以实际结构核对,不由字段名推定。
| 预期列名 | Java 属性 / 类型 | 业务含义与映射 | 源码行 |
|---|---|---|---|
id | id: Long | 编号 | 46 |
trace_id | traceId: String | 链路追踪编号 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 | 52 |
user_id | userId: Long | 用户编号 | 56 |
user_type | userType: Integer | 用户类型 枚举 UserTypeEnum | 62 |
application_name | applicationName: String | 应用名 目前读取 spring.application.name 配置项 | 68 |
request_method | requestMethod: String | 请求方法名 | 75 |
request_url | requestUrl: String | 访问地址 | 79 |
request_params | requestParams: String | 请求参数 query: Query String body: Quest Body | 86 |
file_ids | fileIds: List<Long> | 成功留存的文件 ID;保留已删除文件的 ID,查询时展示删除标记。旧日志为 NULL。;JacksonTypeHandler JSON 数组 | 89 |
response_body | responseBody: String | 响应结果 | 93 |
user_ip | userIp: String | 用户 IP | 97 |
user_agent | userAgent: String | 浏览器 UA | 101 |
operate_module | operateModule: String | 操作模块 | 108 |
operate_name | operateName: String | 操作名 | 112 |
operate_type | operateType: Integer | 操作分类 枚举 OperateTypeEnum | 118 |
begin_time | beginTime: LocalDateTime | 开始请求时间 | 123 |
end_time | endTime: LocalDateTime | 结束请求时间 | 127 |
duration | duration: Integer | 执行时长,单位:毫秒 | 131 |
result_code | resultCode: Integer | 结果码 目前使用的 CommonResult#getCode() 属性 | 138 |
result_msg | resultMsg: String | 结果提示 目前使用的 CommonResult#getMsg() 属性 | 144 |
create_time | createTime: LocalDateTime | 创建时间,INSERT 自动填充 | BaseDO:30 |
update_time | updateTime: LocalDateTime | 修改时间,INSERT_UPDATE 自动填充 | BaseDO:35 |
creator | creator: String | 创建者标识,VARCHAR 映射 | BaseDO:42 |
updater | updater: String | 更新者标识,VARCHAR 映射 | BaseDO:49 |
deleted | deleted: Boolean | 逻辑删除字段 | BaseDO:54 |
infra_api_error_log
源码:ik_project/yudao-cloud/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/logger/ApiErrorLogDO.java:37。
继承:BaseDO(五个审计/软删除字段见下表末尾)。主键候选为 id(实体主键注解或 MyBatis 约定);二级索引、唯一性和物理外键以实际结构核对,不由字段名推定。
| 预期列名 | Java 属性 / 类型 | 业务含义与映射 | 源码行 |
|---|---|---|---|
id | id: Long | 编号 | 37 |
user_id | userId: Long | 用户编号 | 41 |
trace_id | traceId: String | 链路追踪编号 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 | 47 |
user_type | userType: Integer | 用户类型 枚举 UserTypeEnum | 53 |
application_name | applicationName: String | 应用名 目前读取 spring.application.name | 59 |
request_method | requestMethod: String | 请求方法名 | 66 |
request_url | requestUrl: String | 访问地址 | 70 |
request_params | requestParams: String | 请求参数 query: Query String body: Quest Body | 77 |
user_ip | userIp: String | 用户 IP | 81 |
user_agent | userAgent: String | 浏览器 UA | 85 |
exception_time | exceptionTime: LocalDateTime | 异常发生时间 | 92 |
exception_name | exceptionName: String | 异常名 Throwable#getClass() 的类全名 | 98 |
exception_message | exceptionMessage: String | 异常导致的消息 cn.hutool.core.exceptions.ExceptionUtil#getMessage(Throwable) | 104 |
exception_root_cause_message | exceptionRootCauseMessage: String | 异常导致的根消息 cn.hutool.core.exceptions.ExceptionUtil#getRootCauseMessage(Throwable) | 110 |
exception_stack_trace | exceptionStackTrace: String | 异常的栈轨迹 org.apache.commons.lang3.exception.ExceptionUtils#getStackTrace(Throwable) | 116 |
exception_class_name | exceptionClassName: String | 异常发生的类全名 StackTraceElement#getClassName() | 122 |
exception_file_name | exceptionFileName: String | 异常发生的类文件 StackTraceElement#getFileName() | 128 |
exception_method_name | exceptionMethodName: String | 异常发生的方法名 StackTraceElement#getMethodName() | 134 |
exception_line_number | exceptionLineNumber: Integer | 异常发生的方法所在行 StackTraceElement#getLineNumber() | 140 |
process_status | processStatus: Integer | 处理状态 枚举 ApiErrorLogProcessStatusEnum | 149 |
process_time | processTime: LocalDateTime | 处理时间 | 153 |
process_user_id | processUserId: Long | 处理用户编号 关联 cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO.SysUserDO#getId() | 159 |
create_time | createTime: LocalDateTime | 创建时间,INSERT 自动填充 | BaseDO:30 |
update_time | updateTime: LocalDateTime | 修改时间,INSERT_UPDATE 自动填充 | BaseDO:35 |
creator | creator: String | 创建者标识,VARCHAR 映射 | BaseDO:42 |
updater | updater: String | 更新者标识,VARCHAR 映射 | BaseDO:49 |
deleted | deleted: Boolean | 逻辑删除字段 | BaseDO:54 |
本次实测对照
infra_api_access_log:26 列,源码字段全部存在;额外物理列tenant_id。索引:idx_create_time(create_time);PRIMARY(id)唯一。物理外键:本次元数据未返回。infra_api_error_log:28 列,源码字段全部存在;额外物理列tenant_id。索引:PRIMARY(id)唯一。物理外键:本次元数据未返回。
infra_api_access_log.file_ids 本次实测为可空 json;request_params 为 text。两张日志表额外的 tenant_id 由租户拦截器边界解释,不应遗漏于物理字典。