【问题标题】:Turning off hibernate logging console output关闭休眠日志控制台输出
【发布时间】:2008-11-22 15:16:07
【问题描述】:

我正在使用休眠 3,并希望阻止它将所有启动消息转储到控制台。我尝试在 log4j.properties 中注释掉标准输出行,但没有运气。我在下面粘贴了我的日志文件。此外,我使用的是标准项目结构的 eclipse,并且在项目文件夹的根目录和 bin 文件夹中都有 log4j.properties 的副本。

### 将日志消息直接发送到标准输出###
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.Target=System.out
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### 将消息直接发送到文件 hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=hibernate.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### 设置日志级别 - 更详细的日志记录将“信息”更改为“调试”###

log4j.rootLogger=警告,标准输出

#log4j.logger.org.hibernate=信息
log4j.logger.org.hibernate=调试

### 记录 HQL 查询解析器活动
#log4j.logger.org.hibernate.hql.ast.AST=debug

### 只记录 SQL
#log4j.logger.org.hibernate.SQL=debug

### 记录 JDBC 绑定参数 ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### 日志模式导出/更新###
log4j.logger.org.hibernate.tool.hbm2ddl=debug

### 记录 HQL 解析树
#log4j.logger.org.hibernate.hql=debug

### 日志缓存活动###
#log4j.logger.org.hibernate.cache=debug

### 记录事务活动
#log4j.logger.org.hibernate.transaction=debug

### 记录JDBC资源获取
#log4j.logger.org.hibernate.jdbc=debug

### 如果要跟踪连接,请启用以下行###
### 使用 DriverManagerConnectionProvider 时泄漏###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trac5

【问题讨论】:

  • 值得一提的是,Hibernate 4+ 使用 JBOSS 日志记录。

标签: java hibernate logging


【解决方案1】:

重要提示:属性(休眠配置的一部分,不是日志框架配置的一部分!)

hibernate.show_sql

控制日志直接 到 STDOUT 绕过任何日志框架(您可以通过缺少的消息输出格式识别)。如果您使用像 log4j 这样的日志框架,您应该始终将该属性设置为 false,因为它根本没有给您带来任何好处。

这种情况让我很恼火,因为在我尝试编写一些有关 Hibernate 的基准之前,我从来没有真正关心过它。

【讨论】:

  • 我必须在我的 Hibernate(即hibernate.xml)配置中设置这个属性,而不是我的日志配置。谢谢指点!
  • 有没有办法让这个日志记录不绕过通过我的日志记录框架但实际使用它?我看到一些异常发送到我想记录的标准输出。
  • 在我的 Spring Boot 项目中,我将其添加到配置文件 YML conf 文件中。但它没有用,就像这个线程上的其他帖子一样......无论我指定什么,Hibernate 日志都会一直被写入。是否可以在 Logback 配置、应用程序 yaml 文件和 pom.xml 之外的其他地方处理?
  • spring:jpa:属性:hibernate:show_sql:false
【解决方案2】:

尝试设置更合理的日志级别。将日志级别设置为info 意味着只记录info 或更高级别(warnerrorfatal)的日志事件,即忽略debug 日志事件。

log4j.logger.org.hibernate=info

或者在 XML version 的 log4j 配置文件中:

<logger name="org.hibernate">
  <level value="info"/> 
</logger>

另见log4j manual

【讨论】:

  • 在 XML 版本中如何做到这一点?
  • 这似乎合乎逻辑,但对我仍然不起作用(Spring 3.0.5、Hibernate 3.5.6、sf4j-log4j 桥)。每次在 Hibernate 启动时,我仍然会收到大约 100 行“INFO”cmets。所以这可能并不适合所有人。
  • @Twisted Pear:将您的日志记录级别设置为 WARN。那么您将不会收到 INFO 消息。
  • 跟进,因为这个问题从未得到充分解决:Hibernate,即使仍在 4.3.0.Final 中,也有很多硬编码的 System.out.println() 调用。
  • 我如何在 log4j2 .properties 文件中做同样的事情?
【解决方案3】:

执行:

java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.OFF);

在休眠的初始化对我有用之前。


注意:上面的行将关闭 every 注销 (Level.OFF)。如果你想不那么严格,你可以使用

java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);

这已经足够安静了。 (或查看java.util.logging.Level 类了解更多级别)。

【讨论】:

  • 这对我有用:java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);
【解决方案4】:

您可以禁用 hibernate 的许多输出,将 hibernate(hb 配置)的这个 props 设置为 false:

hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments

但如果你想禁用所有控制台信息,你必须将记录器级别设置为 NONE of FATAL of class org.hibernate,就像 Juha 说的那样。

【讨论】:

  • 如果我想生成统计信息而不是日志怎么办?
【解决方案5】:

我终于想通了,这是因为 Hibernate 现在正在使用 slf4j log facade,要桥接到 log4j,你需要将 log4j 和 slf4j-log4j12 jar 放到你的 lib 中,然后 log4j 属性将控制 Hibernate 日志。

我的 pom.xml 设置如下:

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.4</version>
    </dependency>

【讨论】:

【解决方案6】:

为了在日志中禁用Hibernate:select消息,可以将属性设置为HibernateJpaVendorAdapter

<bean id="jpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="showSql" value="false"/>
</bean> 

【讨论】:

    【解决方案7】:

    对于那些不想要优雅的解决方案,只想要一种快速而肮脏的方法来阻止这些消息的人,这里有一个对我有用的解决方案(我使用 Hibernate 4.3.6 和 Eclipse,上面没有提供答案(或在互联网)工作;既不是 log4j 配置文件,也不是以编程方式设置日志记录级别)

    public static void main(String[] args) {
        //magical - do not touch
        @SuppressWarnings("unused")
        org.jboss.logging.Logger logger = org.jboss.logging.Logger.getLogger("org.hibernate");
        java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.WARNING); //or whatever level you need
    
        ...
    }
    

    我在一个从this site下载的教程程序中使用过

    【讨论】:

      【解决方案8】:

      首先要做的是弄清楚实际使用的是哪个日志框架。

      上面的其他作者已经涵盖了许多框架。如果您使用 Logback,您可以通过将此 logback.xml 添加到您的类路径来解决问题:

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <logger name="org.hibernate" level="WARN"/>
      </configuration>
      

      更多信息:Logback Manual-Configuration

      【讨论】:

        【解决方案9】:

        要禁用在日志中打印休眠查询,只需将其添加到您的application.properties

        spring.jpa.show-sql=false
        

        【讨论】:

          【解决方案10】:

          我将“调试”更改为“信息”并且它起作用了。这是我所做的:

          之前:

          log4j.rootLogger=debug, stdout, R
          

          之后:

          log4j.rootLogger=info, stdout, R 
          

          【讨论】:

            【解决方案11】:

            您可以根据 hibernate 包的 logger 层次结构控制 hibernate 日志记录的几个部分(更多关于 logger 层次结构 here)。

                <!-- Log everything in hibernate -->
                <Logger name="org.hibernate" level="info" additivity="false">
                  <AppenderRef ref="Console" />
                </Logger>
            
                <!-- Log SQL statements -->
                <Logger name="org.hibernate.SQL" level="debug" additivity="false">
                  <AppenderRef ref="Console" />
                  <AppenderRef ref="File" />
                </Logger>
            
                <!-- Log JDBC bind parameters -->
                <Logger name="org.hibernate.type.descriptor.sql" level="trace" additivity="false">
                  <AppenderRef ref="Console" />
                  <AppenderRef ref="File" />
                </Logger>
            

            以上内容取自here

            此外,您可以在配置文件中包含属性show-sql:true,因为它取代了日志框架设置。更多关于 here.

            【讨论】:

              【解决方案12】:

              我设法通过添加这两行来停止

              log4j.logger.org.hibernate.orm.deprecation=error
              
              log4j.logger.org.hibernate=error
              

              下面是我的 log4j.properties 的样子,我只是留下一些注释行来解释日志级别

              # Root logger option
              #Level/rules TRACE < DEBUG < INFO < WARN < ERROR < FATAL.
              #FATAL: shows messages at a FATAL level only
              #ERROR: Shows messages classified as ERROR and FATAL
              #WARNING: Shows messages classified as WARNING, ERROR, and FATAL
              #INFO: Shows messages classified as INFO, WARNING, ERROR, and FATAL
              #DEBUG: Shows messages classified as DEBUG, INFO, WARNING, ERROR, and FATAL
              #TRACE : Shows messages classified as TRACE,DEBUG, INFO, WARNING, ERROR, and FATAL
              #ALL : Shows messages classified as TRACE,DEBUG, INFO, WARNING, ERROR, and FATAL
              #OFF : No log messages display
              
              
              log4j.rootLogger=INFO, file, console
              
              log4j.logger.main=DEBUG
              log4j.logger.org.hibernate.orm.deprecation=error
              log4j.logger.org.hibernate=error
              
              #######################################
              # Direct log messages to a log file
              log4j.appender.file.Threshold=ALL
              log4j.appender.file.file=logs/MyProgram.log
              log4j.appender.file.layout=org.apache.log4j.PatternLayout
              log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{1} - %m%n
              
              # set file size limit
              log4j.appender.file=org.apache.log4j.RollingFileAppender
              log4j.appender.file.MaxFileSize=5MB
              log4j.appender.file.MaxBackupIndex=50
              
              
              #############################################
              # Direct log messages to System Out
              log4j.appender.console.Threshold=INFO
              log4j.appender.console.Target=System.out
              log4j.appender.console=org.apache.log4j.ConsoleAppender
              log4j.appender.console.layout=org.apache.log4j.PatternLayout
              log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss} %-5p %c{1} - %m%n
              

              【讨论】:

                【解决方案13】:

                将 slf4j-jdk14-xxx.jar 替换为 slf4j-log4j12-xxx.jar。如果两者都有,请删除 slf4j-jdk14-xxx.jar。在https://forum.hibernate.org/viewtopic.php?f=1&t=999623找到这个解决方案

                【讨论】:

                • 太好了,这行得通。我可以使用log4j.properties 配置; log4j.logger.org.hibernate=OFF
                【解决方案14】:

                要摆脱控制台中的记录器输出,试试这个。

                ch.qos.logback.classic.LoggerContext.LoggerContext loggerContext = (LoggerContext) org.slf4j.LoggerFactory.LoggerFactory.getILoggerFactory();
                
                loggerContext.stop();
                

                这些语句禁用了记录器的所有控制台输出。

                【讨论】:

                  【解决方案15】:

                  就我而言,我添加了依赖项

                      <dependency>
                          <groupId>org.hibernate</groupId>
                          <artifactId>hibernate-entitymanager</artifactId>
                          <version>5.5.6.Final</version>
                      </dependency>
                  

                  这不是必需的。我删除了它,一切正常

                  【讨论】:

                    猜你喜欢
                    • 2011-08-26
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-01-28
                    • 1970-01-01
                    • 2019-10-06
                    • 2017-11-22
                    相关资源
                    最近更新 更多