2012-06-14 104 views
1

p6spy对于调试hibernate查询非常有用,但是,还有什么方法可以用相同的Hibernate逻辑格式化查询? :p6spy日志与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 
     (?, ?) 

我觉得休眠格式更可读,我希望这样的事情与P6SPY。

谢谢。

回答

1

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中,我们增加了一个新的战略界面来处理日志消息格式。这与提供新的记录器的工作量大致相同,但它将被所有记录器使用。您只需提供一个实现MessageFormattingStrategy接口的类。为了让p6spy使用新策略,只需在spy.properties中配置它或设置系统属性即可。具体请参见the configuration docs。例如,看看MultiLineFormat

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