【问题标题】:Hibernate does not log stacktraceHibernate 不记录堆栈跟踪
【发布时间】:2014-11-01 13:03:36
【问题描述】:

我通过 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();
            }
        }
    }

现在,在我为整个休眠状态激活 DEBUG 后,它确实会打印 stackTrace,但会记录很多垃圾。我可以做些什么来只记录 stackTraces?

标记记录器的包有SqlExceptionHelper 到 DEBUG 的类可以解决问题,但我不确定我会得到所有的休眠错误日志。

有什么帮助吗?

【问题讨论】:

  • 您的代码中的LOG 是什么?
  • SqlExceptionHelper 是一个使用 BasicLogger 的休眠类。

标签: java hibernate logging


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:
        #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是异常对象

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多