如何使用记录器打印 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 查询?
答案 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"));
更多信息