开发者社区> 问答> 正文

sql日志打印 能支持下 LocalDateTime、 LocalDate 等类型吗?

1、系统用的是 druid + slf4j + mysql + mybatis

2、sql日志打印时,输出格式略奇怪,是关于LocalDateTime字段的,如下 {conn-10003, pstmt-20066} executed. update employee set employee_name = '李四', sex = '男', create_by = 1, create_time = 'java.time.LocalDateTime', deleted = '0' where id = 3

3、create_time = 'java.time.LocalDateTime' 这里输出了一个类名而不是具体的值

4、我debug后,进入包:package com.alibaba.druid.sql.visitor 中的 SQLASTOutputVisitor类, 发现该类中的 public void printParameter(Object param) 函数还没支持 LocalDateTime类型, 到最后只能 输出: print0("'" + param.getClass().getName() + "'");

5、希望能改进

原提问者GitHub用户lqzxpp

展开
收起
山海行 2023-07-05 18:13:10 107 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在 SQL 日志打印中,是否支持 LocalDateTime、LocalDate 等类型取决于具体的日志库和日志配置。一般来说,如果您使用的日志库支持自定义格式化输出方式,那么就可以支持这些类型的日志打印。

    2023-07-30 20:00:20
    赞同 展开评论 打赏
  • 你使用的是Druid、SLF4J、MySQL和MyBatis构建的系统。在打印SQL日志时,对于LocalDateTime类型的字段,输出的格式有些奇怪,显示为类名而不是具体的值。你在调试中发现com.alibaba.druid.sql.visitor.SQLASTOutputVisitor类中的printParameter(Object param)方法不支持LocalDateTime类型。

    2023-07-11 09:09:28
    赞同 展开评论 打赏
  • 问题已修复,请用新版本

    https://github.com/alibaba/druid/releases/tag/1.2.5

    原回答者GitHub用户wenshao

    2023-07-06 10:49:09
    赞同 展开评论 打赏
  • 要改进SQL日志打印支持LocalDateTime和LocalDate类型,你需要对Druid的SQLASTOutputVisitor类进行修改。下面是一种可能的解决方案:

    1. 在你的项目中创建一个新的类,继承自SQLASTOutputVisitor类。
    2. 在该新类中,重写printParameter方法来支持LocalDateTime和LocalDate类型的打印。
    3. 在重写的printParameter方法中,判断param是否为LocalDateTime或LocalDate类型,并将其格式化为字符串。
    4. 使用重写后的SQLASTOutputVisitor类替换掉原始的Druid SQLASTOutputVisitor。

    以下是一个示例代码片段,演示了如何实现上述步骤:

    import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    
    public class CustomSqlASTOutputVisitor extends SQLASTOutputVisitor {
    
        public CustomSqlASTOutputVisitor(Appendable appender) {
            super(appender);
        }
    
        @Override
        public void printParameter(Object param) {
            if (param instanceof LocalDateTime) {
                LocalDateTime dateTime = (LocalDateTime) param;
                String formattedDateTime = dateTime.toString(); // 根据需要选择合适的日期时间格式化方式
                print0("'" + formattedDateTime + "'");
            } else if (param instanceof LocalDate) {
                LocalDate date = (LocalDate) param;
                String formattedDate = date.toString(); // 根据需要选择合适的日期格式化方式
                print0("'" + formattedDate + "'");
            } else {
                super.printParameter(param);
            }
        }
    }
    

    然后,在你的代码中使用上述自定义的CustomSqlASTOutputVisitor类,替换掉Druid默认的SQLASTOutputVisitor。

    import com.alibaba.druid.sql.SQLUtils;
    import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
    
    // ...
    
    // 创建你的SQLASTOutputVisitor对象
    SQLASTOutputVisitor visitor = new CustomSqlASTOutputVisitor(new StringBuilder());
    
    // 使用自定义的visitor打印SQL日志
    String sql = "SELECT * FROM table_name";
    String formattedSql = SQLUtils.format(sql, visitor);
    System.out.println(formattedSql);
    
    2023-07-05 18:55:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载