hibernate - p6spy 日志与 Hibernate 日志

标签 hibernate logging p6spy

p6spy 对于调试 Hibernate 查询非常有用,但是,有什么方法可以使用与 Hibernate 相同的逻辑来格式化查询吗? :

<property name="hibernate.format_sql" value="true" />

p6spy 日志示例: p6spy - 1339663561390|15|0|statement|select personne0_.id as id5_,personne0_.dateNaissance as dateNais2_5_, personne0_.nom as nom5_, personne0_.prenom as prenom5_, personne0_.type as type5_ from Personne personne0_ where personne0_.nom=?|select personne0_.id as id5_, personne0_.dateNaissance as dateNais2_5_, personne0_.nom as nom5_, personne0_.prenom as prenom5_, personne0_.type as type5_ from Personne personne0_ where personne0_.nom='example'

hibernate 日志示例:

Hibernate: 
    insert 
    into
        TABLE
        (COLUMN_1, COLUMN_2) 
    values
        (?, ?)

我认为 hibernate 格式更具可读性,我想要 p6spy 类似的东西。

谢谢。

最佳答案

P6Spy 捕获 SQL 语句并“按原样”记录它。它根本不会尝试进行任何类型的格式化。但是,P6Spy 可以轻松扩展以实现您正在寻找的行为。 1.3 和 2.0 版本的工作原理有所不同(2.0 版本更简单)。

1.3 - 对您当前使用的记录器进行子类化并覆盖 logSQL(...) 方法。例如,如果您使用 FileLogger,您的子类可能类似于下面的示例。将已编译的类放在类路径上后,只需更新 spy .properties 即可使用新的记录器实现。

public class MyLogger extends FileLogger {
  public void logSQL(int connectionId, String now, long elapsed, String category, String prepared, String sql) {
    super.logSQL(connectionId,now,elapsed,category,reformat(prepared),reformat(sql));
  }
  private String reformat(final String sql) {
    // formatting logic goes here
  }
}

2.0 - 在2.0中,我们添加了一个新的策略接口(interface)来处理日志消息格式。这与提供新记录器的工作量大致相同,但它将被所有记录器使用。您只需要提供一个实现 MessageFormattingStrategy 接口(interface)的类。要使 p6spy 使用新策略,您只需在spy.properties 中配置它或设置系统属性。请参阅the configuration docs了解具体情况。例如,请查看 MultiLineFormat .

顺便说一句 - 如果您确实创建了新的格式化策略并想分享它,请向我们发送拉取请求。 P6Spy 现在维护在 GitHub .

关于hibernate - p6spy 日志与 Hibernate 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11030697/

相关文章:

java - Websphere MQ - Java 应用程序 - 启用日志记录

logging - GlassFish 服务器日志的位置

iPhone 通话记录/历史记录

tomcat - 如何将 P6Spy 日志语句打印到 Tomcat 控制台

java - hibernate p6spy问题

logging - 如何使用 Flyway gradle 插件配置 sql 日志记录?

java - 如何在 SQL 查询中安全地使用 * 作为通配符

mongodb - 将MongoDB和Hibernate结合使用的Grails 3.3.0 M1和3.3.0 M2失败

java - hibernate 是否检查对象是否实际上已更改,还是假设 setter 是否被调用?

hibernate - grails自定义GORM方言阻止 'grails shell'起作用-类路径之谜