Java 在postgres jdbc驱动程序中记录准备好的sql语句

Java 在postgres jdbc驱动程序中记录准备好的sql语句,java,postgresql,jdbc,Java,Postgresql,Jdbc,我想在java应用程序中记录所有准备好的sql语句。我使用的是标准的PostgresJDBC驱动程序org.postgresql.driver。此驱动程序有一个名为“”的参数 “日志级别”,可设置为1(信息)或2(调试)。关键是,如果参数设置为1,它几乎什么都不记录,如果设置为2,它的跟踪太像了 ... 20:59:05.608 (2) FE=> Bind(stmt=null,portal=null,$1=<'5'>,$2=<'13'>) 20:59:05.609

我想在java应用程序中记录所有准备好的sql语句。我使用的是标准的PostgresJDBC驱动程序org.postgresql.driver。此驱动程序有一个名为“”的参数 “日志级别”,可设置为1(信息)或2(调试)。关键是,如果参数设置为1,它几乎什么都不记录,如果设置为2,它的跟踪太像了

...
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)
...
。。。
20:59:05.608(2)FE=>Bind(stmt=null,portal=null,$1=,$2=)
20:59:05.609(2)FE=>描述(入口=null)
20:59:05.609(2)FE=>Execute(入口=null,限制=1)
20:59:05.609(2)FE=>同步

20:59:05.648(2)你很幸运,你正在使用PostgreSQL。postgresqljdbc驱动程序的
PreparedStatement
实现(至少从8.x或其他版本开始)以这种方式被覆盖,因此您可以看到整个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或其他)

我在9.1版本的驱动程序中没有看到这一点。9.3适用于我。如果您可以访问应用程序代码,则可以。您知道如何记录无法更改的第三方代码的语句(但配置日志记录)吗?