使用记录器打印PreparedStatement的完整查询

时间:2013-12-05 10:14:34

标签: java mysql jdbc prepared-statement

如何使用记录器打印 PreparedStatement 的完整查询?

使用 JDBC 驱动程序: com.microsoft.sqlserver.jdbc.SQLServerDriver

log4.properties contains
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=logs/ProductDataLibrary.log
log4j.appender.logfile.MaxFileSize=10240KB
log4j.appender.logfile.MaxBackupIndex=0
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{DATE}~ %5p ~ %C:%L ~ %x ~ %m%n

我尝试使用preparedstatement.toString()方法,但它打印了一些@object而不是完整的 SQL 查询?

2 个答案:

答案 0 :(得分:1)

如果您正在使用抽象层(例如hibernate),那么最好使用它们的内置日志记录。

如果你想自己滚动,你应该使用委托模式包装java.sql.Connection。例如:

public class WrappedConnection implements Connection {
    private Connection delegate;
    public WrappedConnection(Connection delegate) { this.delegate = delegate; }
    public PreparedStatement prepareStatement(String sql) {
       PreparedStatement ps = delegate.prepareStatement(sql);
       return new WrappedPreparedStatement(sql, ps);
    }
    // delegate all Connection methods to the delegate
}

public class WrappedPreparedStatement implements PreparedStatement {
    private String sql;
    private PreparedStatement delegate;
    public WrappedPreparedStatement(String sql, PreparedStatement delegate) { 
       this.sql = sql; 
       this.delegate = delegate;
    }
    public String toString() {
        return sql;
    }
    public ResultSet executeQuery() throws SQLException {
        // perhaps you might want to do some logging here?
        return delegate.executeQuery();
    }
    // delegate all PreparedStatement methods to the delegate
}

使用这种方法,您可能也会包裹Connection.createStatement(*)Connection.prepareCall(*)

修改

看起来有人已经为你完成了艰苦的工作,看看log4jdbc

答案 1 :(得分:-2)

将DEBUG或TRACE级别添加到log4j.properties中的java.sql.PreparedStatement

log4j.logger.java.sql.PreparedStatement=DEBUG

log4j.logger.java.sql.PreparedStatement=TRACE

如果要获取完整的JDBC操作日志,请将DEBUG级别添加到java.sql

log4j.logger.java.sql=DEBUG

或者如果您想要为单个JDBC类添加

的具体日志记录
log4j.logger.java.sql.theclass=DEBUG

一个例子

log4j.logger.java.sql.Connection=DEBUG    
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

编辑:我的错误,我忘了SQLServer JDBC驱动程序不使用log4j

您无法通过带有属性文件

的java.util.logging.LogManager配置日志记录
handlers= java.util.logging.FileHandler


    # Default global logging level.
    .level= ALL

    # default file output
    java.util.logging.FileHandler.pattern = /tmp/sql.log
    java.util.logging.FileHandler.limit = 5000000
    java.util.logging.FileHandler.count = 20
    java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
    java.util.logging.FileHandler.level = ALL

    # Facility specific properties.
    com.microsoft.sqlserver.jdbc.level=ALL
    com.microsoft.sqlserver.jdbc.Statement.level=ALL
    com.microsoft.sqlserver.jdbc.SQLServerStatement.level=ALL

并在运行时获取

LogManager.getLogManager().readConfiguration(new FileInputStream("c:/tmp/sql.properties"));

更多信息

Tracing Driver Operation