I want to log all prepared sql statements in my java application. I'm using the standard postgres jdbc driver org.postgresql.Driver. This driver has a parameter called " loglevel" which can be set to 1 (INFO) or 2 (DEBUG). The point is if the parameter is set to 1 it's almost logging nothing, if set to 2 it's tracing too much like
...
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)
...
Is there a way to only log the statements + parameters?
You're lucky that you're using PostgreSQL. The PreparedStatement
implementation of the PostgreSQL JDBC driver (at least, since 8.x or something) has its toString()
overridden that way so you could see the entire SQL statement with all parameters filled in the right places. So you could just do something like:
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, value1);
preparedStatement.setString(2, value2);
// ...
logger.debug(preparedStatement); // Will show entire SQL with all values.
(where logger
is just your logger, e.g. slf4j/logback or something)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With