2012-06-14 138 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