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

mar*_*kus 7 java postgresql jdbc

我想在我的java应用程序中记录所有准备好的sql语句.我正在使用标准的postgres jdbc驱动程序org.postgresql.Driver.该驱动程序有一个名为"loglevel"的参数,可以设置为1(INFO)或2(DEBUG).关键是如果参数设置为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)
...
Run Code Online (Sandbox Code Playgroud)

有没有办法只记录语句+参数?

Bal*_*usC 8

你很幸运,你正在使用PostgreSQL.PreparedStatementPostgreSQL JDBC驱动程序的实现(至少,从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.
Run Code Online (Sandbox Code Playgroud)

(logger只是你的记录器,例如slf4j/logback或其他东西)

  • 如果您有权访问应用程序代码,是的。知道如何记录您无法更改(但配置日志记录)的第三方代码的语句吗? (2认同)