How to enable logging for SQL statements when using JDBC

2019 update: log4jdbc has not been maintained since 2015. p6spy still seems to be actively maintained.

Original answer

There are lot of Spy frameworks available for this purpose , please check log4jdbc , I fell this is what you are looking for.

Features

  • Full support for JDBC 3 and JDBC 4!
  • Easy to configure, in most cases
    all you need to do is change the driver class name to
    net.sf.log4jdbc.DriverSpy and prepend “jdbc:log4” to your existing
    jdbc url, set up your logging categories and you’re ready to go!
  • In the logged output, for prepared statements, the bind arguments are
    automatically inserted into the SQL output. This greatly Improves
    readability and debugging for many cases.
  • SQL timing information can be generated to help identify how long SQL statements take to run,
    helping to identify statements that are running too slowly and this
    data can be post processed with an included tool to produce profiling
    report data for quickly identifying slow SQL in your application.
  • SQL connection number information is generated to help identify
    connection pooling or threading problems. Works with any underlying
    JDBC driver, with JDK 1.4 and above, and SLF4J 1.x.
  • Open source software, licensed under the business friendly Apache 2.0 license

Usage

  • Place the log4jdbc jar (based on the JDK version) into your application’s classpath.
  • choose logging system to use, log4j, logback, commons logging..etc are supported
  • Set your JDBC driver class to net.sf.log4jdbc.DriverSpy in your application’s configuration.
    The underlying driver that is being spied on in many cases will be loaded automatically without any additional configuration.
  • Prepend jdbc:log4 to the normal jdbc url that you are using.

    For example, if your normal jdbc url is
    jdbc:derby://localhost:1527//db-derby-10.2.2.0-bin/databases/MyDatabase
    then You would change it to:
    jdbc:log4jdbc:derby://localhost:1527//db-derby-10.2.2.0-bin/databases/MyDatabase

  • Set up your loggers.

    jdbc.sqlonly: Logs only SQL. SQL executed within a prepared statement is automatically shown with it’s bind arguments replaced with the data bound at that position, for greatly increased readability. 1.0

    jdbc.sqltiming: Logs the SQL, post-execution, including timing statistics on how long the SQL took to execute. 1.0

    jdbc.audit: Logs ALL JDBC calls except for ResultSets. This is a very voluminous output, and is not normally needed unless tracking down a specific JDBC problem. 1.0

    jdbc.resultset: Even more voluminous, because all calls to ResultSet objects are logged. 1.0

    jdbc.connection: Logs connection open and close events as well as dumping all open connection numbers. This is very useful for hunting down connection leak problems.

Leave a Comment