Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Logging prepared sql statements in postgres jdbc driver

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?

like image 205
markus Avatar asked Aug 25 '11 19:08

markus


1 Answers

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)

like image 53
BalusC Avatar answered Nov 07 '22 06:11

BalusC