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
在 SQL 日志打印中,是否支持 LocalDateTime、LocalDate 等类型取决于具体的日志库和日志配置。一般来说,如果您使用的日志库支持自定义格式化输出方式,那么就可以支持这些类型的日志打印。
你使用的是Druid、SLF4J、MySQL和MyBatis构建的系统。在打印SQL日志时,对于LocalDateTime类型的字段,输出的格式有些奇怪,显示为类名而不是具体的值。你在调试中发现com.alibaba.druid.sql.visitor.SQLASTOutputVisitor类中的printParameter(Object param)方法不支持LocalDateTime类型。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.5
原回答者GitHub用户wenshao
要改进SQL日志打印支持LocalDateTime和LocalDate类型,你需要对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);
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。