9

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?

markus
  • 6,258
  • 13
  • 41
  • 68

1 Answers1

10

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)

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555