Skip to content

日志审计按操作时间筛选时遗漏 SQL 记录 #167

Description

@Arlowen

问题描述

用户通过数据查询页面成功执行 SQL 后,SQL 审计事件已经生成并落库,但在“日志审计”页面按默认操作时间范围查询时看不到记录。清空“操作时间”条件后记录可以出现。

复现步骤

  1. 使用普通账号(现场复现账号为 pika)执行:

    select * from `aa_revise_test11`;
  2. 打开“系统管理 / 日志审计”页面。

  3. 使用页面默认的操作时间范围查询。

  4. 观察不到刚刚执行的 SQL。

  5. 清空“操作时间”筛选条件后重新查询,记录出现。

实际结果

  • 执行侧 sql_audit.log 已生成完整的 [START][SUCCESS] 事件。

  • 数据库中对应审计记录已经存在,现场记录 ID 为 3637,状态均为 SUCCESS

  • 控制台实际记录的 SQL 为:

    select * from aa_revise_test11 LIMIT 3000
  • 同一个查询时间范围:

    • 过滤 gmt_create 只能返回 4 条;
    • 过滤 operate_time 可以返回 33 条,并包含上述两条记录。

因此不是审计事件未生成或未落库,而是时间条件将记录过滤掉。

根因分析

时间字段和时区处理不一致:

  • 前端 frontend/src/views/system/SqlLog.vue 构造查询时间时固定减去 8 小时;
  • 后端 backend/clouddm-platform/cgdm-dao/src/main/resources/mybatis/mapper/DmExecSqlAuditMapper.xml 使用该范围过滤 gmt_create
  • 页面实际展示和排序使用的是 operate_time

这会导致东八区环境下按操作时间查询时遗漏已存在的审计记录。

另外,页面刷新不会更新查询结束时间,页面打开后新产生的 SQL 也可能继续被旧时间窗口遗漏。

期望结果

  • “操作时间”筛选应基于 operate_time,并使用一致、明确的时区语义。
  • 页面默认时间范围能够查到刚执行并成功落库的 SQL。
  • 点击刷新时应更新查询结束时间,能够包含页面打开后产生的新记录。
  • 清空时间条件与设置等价完整时间范围时,结果集合应保持一致。

建议修复

  1. 将 Mapper 的时间范围过滤字段由 gmt_create 调整为 operate_time
  2. 统一前后端时间传递与时区转换,避免固定减 8 小时与数据库本地时间混用。
  3. 刷新查询时重新计算结束时间。
  4. 增加东八区环境下的审计时间范围回归测试。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions