RuoYi 中开启 mybatis debug 日志

文章目录

    昨天遇到一个 mybatis SQL bug,排查了半天才定位到问题。同时使用了三个不同模型,都没有很好地定位到问题。但,这不完全是 AI 的问题,还是旧系统的表设计太随意了。

    报错信息

    Error querying database. Cause: java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配

    但是我肉眼看了半天也没看出有什么问题,无非就是 date 类型转字符串的问题。AI 也一段乱改,也没有修复。而这个 SQL 100 多行,看起来头痛。所以想能不能打开 debug 日志,看看具体传递给 mybatis xml 中的参数值是什么类型,以及什么值。

    启用 debug 日志

    <configuration>
        ...
        <!-- MyBatis SQL 日志 -->
        <logger name="cn.xxx.business.stats.mapper" level="DEBUG" />
        <logger name="org.mybatis" level="DEBUG" />
        <logger name="java.sql" level="DEBUG" />
        <logger name="java.sql.PreparedStatement" level="DEBUG" />
    </configuration>
    

    启用之后,就能看到 SQL 对应的参数值,即,每个 ? 对应的实际值和类型。以 RuoYi 的用户表为例:

    19:37:07.588 [debug,137] - ==>  Preparing: update sys_user SET login_ip = ?, login_date = ?, update_time = sysdate where user_id = ?
    19:37:07.598 [debug,137] - ==> Parameters: 127.0.0.1(String), 2026-07-17 16:37:06.979(Timestamp), 1(Long)
    

    也确实靠这个方法定位到了问题,原来是联表查询时,关联了两个表,但是两个表的日期字段使用不同的字段类型,一个是日期类型,另一个是字符串类型。所以,参数类型转换的方法应该是不同的,而 AI 想当然的以为是同类型的。。。看来以后在让 AI 排查 SQL 问题时,一定要把建表语句提前给到 AI。

    开发环境与生产环境启用不同的日志级别

    开发环境配置文件 application-dev.yml

    # 日志配置(开发环境:开启 MyBatis SQL 调试日志)
    logging:
      level:
        cn.xxx: debug
        org.mybatis: debug
    

    生产环境配置文件 application-prod.yml

    # 日志配置(生产环境:关闭 SQL 日志,仅保留 info 及以上)
    logging:
      level:
        cn.xxx: info
        org.mybatis: warn
    

    公共配置文件 application.yml

    # 日志配置
    logging:
      level:
        cn.xxx: info
        org.springframework: warn
    

    日志记录的目录也做区分

    这个则需要把 logback.xml 改为 logback-spring.xml。
    因为 logback-spring.xml 是 Spring Boot 的“一等公民”。Spring Boot 在启动时会主动找到它,插入自身的上下文信息,这使得日志配置能感知并利用 Spring 的强大功能。而 logback.xml 则是一个独立的 Logback 配置文件。

    logback-spring.xml 中的日志路径配置

    <springProperty name="log.path" source="logging.path" defaultValue="/home/ruoyi/logs" />
    

    application-dev.yml 中的日志路径配置

    logging:
      path: logs
    

    application-prod.yml 中的日志路径配置

    logging:
      path: /var/logs/xxx/
    

    AI Skill

    遇到类似的 “ORA-01861: 文字与格式字符串不匹配” 时,让 AI 去指定的目录或文件中查看对应的表结构。

    但是这个方案,还是浪费时间,应该在写代码时,就让 AI 去对应的建表语句文件参考对应表的结构。

    补充

    今天外出溜达时,看了一下 mybatis 教程,发现还有比 debug 更低的日志级别:

    MyBatis日志的最低级别是TRACE,在这个日志级别下,MyBatis会输出执行SQL过程中的详细信息,这个级别特别适合在开发时使用。

    mybatis 最常用的是以下五个级别(按输出信息量从多到少排序):

    • TRACE:最详细级别,输出 SQL 参数绑定、结果集映射等调试信息。
    • DEBUG:输出 MyBatis 核心日志(如执行的 SQL 语句)。想看到 SQL 语句至少应设为该级别。
    • INFO:输出应用运行过程中的一般信息。
    • WARN:输出潜在问题或警告信息。
    • ERROR:仅输出错误和异常信息。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式