关闭休眠日志记录控制台输出


84

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

###将日志消息直接发送到stdout ###
#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

###设置日志级别-有关更详细的日志记录,将'info'更改为'debug'###

log4j.rootLogger =警告,标准输出

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

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

###仅记录SQL
#log4j.logger.org.hibernate.SQL =调试

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

###日志架构导出/更新###
log4j.logger.org.hibernate.tool.hbm2ddl =调试

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

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

###记录交易活动
#log4j.logger.org.hibernate.transaction =调试

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

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

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

Answers:


77

尝试设置更合理的日志记录级别。日志级别设置为info仅记录在事件的装置info或更高的水平(warnerrorfatal)被记录,被debug记录的事件被忽略。

log4j.logger.org.hibernate=info

或在XML版本的log4j配置文件中:

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

另请参见log4j手册


1
您如何在XML版本中做到这一点?
詹姆斯·麦克马洪

您可以通过执行上述操作将此方法应用于org.hibernate中的所有软件包,或者如果您希望对hibernate中的不同软件包使用不同的级别,则可以以相同的方式指定这些软件包。
马修·布鲁贝克

3
这似乎合乎逻辑,但是对我来说仍然不起作用(Spring 3.0.5,Hibernate 3.5.6,sf4j-log4j桥)。每次在Hibernate启动时,我仍然会收到约100行“ INFO”注释。因此,这可能不适用于每个人。
Joseph Lust

1
@Twisted Pear:将您的日志记录级别设置为WARN。然后,您将不会收到INFO消息。
JuhaSyrjälä2011年

5
后续操作至今仍未得到充分解决:Hibernate,即使仍在4.3.0.Final中,也有许多硬编码的System.out.println()调用。
克莱里斯-cautiouslyoptimistic-

85

重要说明:属性(休眠配置的一部分,而不是日志记录框架配置的一部分!)

hibernate.show_sql

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

这种情况激怒了我很长一段时间,因为直到我尝试编写一些有关Hibernate的基准测试时,我才真正关心它。


2
hibernate.xml与我的日志记录配置相反,我必须在Hibernate(即)配置中设置此属性。感谢您的指导!
JJ Zabkar 2015年

有没有一种方法可以使此日志记录不绕过我的日志记录框架,而是实际使用它?我看到一些异常要发送到标准输出,我想记录这些异常。
莱格纳

1
在我的Spring启动项目中,我将此添加到了配置文件YML conf文件中。但这没有用,就像该线程上的其他帖子一样……无论我指定什么内容,Hibernate日志都会不断被写入。除了Logback配置,应用程序yaml文件和pom.xml之外,还可以在其他地方进行处理吗?
亚历克斯

33

执行中:

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

之前,hibernate的初始化对我有用。


注意:上一行将关闭所有注销(Level.OFF)。如果您不想那么严格,可以使用

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

那足够安静。(或检查java.util.logging.Level课程以了解更多级别)。


1
这对我java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);
有用

16

您可以禁用许多休眠输出,将此休眠属性(hb配置)设置为false:

hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments

但是,如果要禁用所有控制台信息,则必须将记录器级别设置为“无致命”级别,org.hibernate如Juha所说。


如果我想生成统计信息而不是日志怎么办?
markthegrea 2014年

7

我终于弄清楚了,这是因为Hibernate现在正在使用slf4j日志外观,以桥接到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>

实际上,您可以通过添加-Dorg.jboss.logging.provider=slf4j到VM选项使Hibernate显式使用slf4j 。我写了一篇有关该主题的文章:medium.com/@scadge/how-to-enable-hibernate-logging-dc11545efd3d
Scadge

5

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

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

4

对于那些不希望采用优雅解决方案的人来说,这只是一种阻止这些消息的快速而肮脏的方法,这是一种对我有用的解决方案(我使用的是Hibernate 4.3.6和Eclipse,并且上面没有提供答案(或在Internet上找到)工作;既不是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

    ...
}

我在从此站点下载的教程程序中使用了它


3

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

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

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

更多信息:手动登录配置


1

我将“调试”更改为“信息”,并且有效。这是我所做的:

之前:

log4j.rootLogger=debug, stdout, R

后:

log4j.rootLogger=info, stdout, R 


0

要摆脱控制台中的记录器输出,请尝试此操作。

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

loggerContext.stop();

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


0

有记录,你可以根据Hibernate包(更多的记录层次的记录等级控制休眠的几个部分在这里)。

    <!-- 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>

以上是从这里来的

另外,您可以show-sql:true在配置文件中拥有该属性,因为该属性将取代日志记录框架设置。在这里更多。


0

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.