Hibernate不记录stacktrace

时间:2014-09-08 10:22:37

标签: java hibernate logging

我有通过log4j配置的休眠日志:

log4j.logger.org.hibernate=INFO

如果出现错误,我只会收到异常消息而不是完整的堆栈跟踪:

[APPNAME] 2014-09-08 15:44:40,487 ERROR [http-bio-808-exec-3] SqlExceptionHelper.logExceptions(146) | ERROR: column user0_.nationality does not exist
  Position: 1365

因为SqlExceptionHelper.logExceptions()具有:

public void logExceptions(SQLException sqlException, String message) {
        if ( LOG.isEnabled( Level.ERROR ) ) {
            if ( LOG.isDebugEnabled() ) {
                message = StringHelper.isNotEmpty( message ) ? message : DEFAULT_EXCEPTION_MSG;
                LOG.debug( message, sqlException );
            }
            final boolean warnEnabled = LOG.isEnabled( Level.WARN );
            while ( sqlException != null ) {
                if ( warnEnabled ) {
                    LOG.warn( "SQL Error: " + sqlException.getErrorCode() + ", SQLState: " + sqlException.getSQLState() );
                }
                LOG.error( sqlException.getMessage() );
                sqlException = sqlException.getNextException();
            }
        }
    }

现在我为整个hibernate激活DEBUG之后,它确实打印了stackTrace,但是记录了很多垃圾。我该怎么做才能记录stackTraces?

将包标记为包的类SqlExceptionHelper到DEBUG可以解决问题,但不确定我是否会获得hibernate生成的所有错误日志。

任何帮助?

2 个答案:

答案 0 :(得分:0)

要查看堆栈跟踪,您需要使用

LOG.error(sqlException.getMessage(), sqlException); 

你能扩展SqlExceptionHelper并覆盖logExceptions方法,以便它使用这一行吗?

答案 1 :(得分:0)

    #log4j.rootLogger=@replaced.log4j.rootLogger@
log4j.appender.logfile.File=@replaced.log4j.appender.logfile@

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n

log4j.appender.logfile=org.apache.log4j.RollingFileAppender

log4j.appender.logfile.MaxFileSize=512KB
# Keep three backup files
log4j.appender.logfile.MaxBackupIndex=3
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
#Pattern to output : date priority [category] - <message>line_separator
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - <%m>%n

log4j.category.net.sf.acegisecurity=INFO
log4j.category.com.dc=DEBUG
log4j.category.org.apache.myfaces=INFO
log4j.category.javax.faces=INFO

# logs the SQL statements
#log4j.logger.org.hibernate.SQL=DEBUG

# Logs the JDBC parameters passed to a query
#log4j.logger.org.hibernate.type=TRACE
# Root logger option
log4j.rootLogger=INFO, stdout

以上log4j设置应该有帮助,然后您需要使用的是

LOGGER.error(e,e)//其中e是异常对象

希望这有帮助