2011-08-25 36 views
6

我想在我的java應用程序中記錄所有準備好的sql語句。我使用標準的postgres jdbc驅動程序org.postgresql.Driver。該驅動程序有一個名爲「 loglevel」的參數,可以將其設置爲1(INFO)或2(DEBUG)。問題的關鍵是,如果該參數設置爲1,它幾乎沒有任何記錄,如果設置爲2它跟蹤太像在postgres jdbc驅動程序中記錄準備好的sql語句

... 
20:59:05.608 (2) FE=> Bind(stmt=null,portal=null,$1=<'5'>,$2=<'13'>) 
20:59:05.609 (2) FE=> Describe(portal=null) 
20:59:05.609 (2) FE=> Execute(portal=null,limit=1) 
20:59:05.609 (2) FE=> Sync 
20:59:05.648 (2) <=BE ParseComplete [null] 
20:59:05.649 (2) <=BE BindComplete [null] 
20:59:05.649 (2) <=BE NoData 
20:59:05.649 (2) <=BE CommandStatus(UPDATE 1) 
... 

有沒有辦法來僅記錄報表+參數?

回答

7

很幸運,您使用的是PostgreSQL。 PostgreSQL JDBC驅動程序的PreparedStatement實現(至少從8.x開始)的toString()覆蓋了這種方式,所以你可以看到整個SQL語句的所有參數填充在正確的位置。所以,你可能只是這樣做:

preparedStatement = connection.prepareStatement(sql); 
preparedStatement.setString(1, value1); 
preparedStatement.setString(2, value2); 
// ... 
logger.debug(preparedStatement); // Will show entire SQL with all values. 

(其中logger只是你的記錄,例如SLF4J /或的logback東西)

+0

我並不是在9.1版本的驅動程序看到這個。 – Pointy

+0

適用於9.3。 –

+0

如果您有權訪問應用程序代碼,那麼是的。任何想法如何記錄你不能改變(但配置日誌)的第三方代碼的聲明? – Thilo

相關問題