Turning off hibernate logging console output
JavaHibernateLoggingJava Problem Overview
I'm using hibernate 3 and want to stop it from dumping all the startup messages to the console. I tried commenting out the stdout lines in log4j.properties but no luck. I've pasted my log file below. Also I'm using eclipse with the standard project structure and have a copy of log4j.properties in both the root of the project folder and the bin folder.
### direct log messages to 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%ndirect messages to file 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
set log levels - for more verbose logging change 'info' to 'debug'
log4j.rootLogger=warn, stdout
#log4j.logger.org.hibernate=info log4j.logger.org.hibernate=debug
log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug
log just the SQL
#log4j.logger.org.hibernate.SQL=debug
log JDBC bind parameters
log4j.logger.org.hibernate.type=info #log4j.logger.org.hibernate.type=debug
log schema export/update
log4j.logger.org.hibernate.tool.hbm2ddl=debug
log HQL parse trees
#log4j.logger.org.hibernate.hql=debug
log cache activity
#log4j.logger.org.hibernate.cache=debug
log transaction activity
#log4j.logger.org.hibernate.transaction=debug
log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug
enable the following line if you want to track down connection
leakages when using DriverManagerConnectionProvider
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trac5
Java Solutions
Solution 1 - Java
Important notice: the property (part of hibernate configuration, NOT part of logging framework config!)
hibernate.show_sql
controls the logging directly to STDOUT bypassing any logging framework (which you can recognize by the missing output formatting of the messages). If you use a logging framework like log4j, you should always set that property to false because it gives you no benefit at all.
That circumstance irritated me quite a long time because I never really cared about it until I tried to write some benchmark regarding Hibernate.
Solution 2 - Java
Try to set more reasonable logging level. Setting logging level to info
means that only log event at info
or higher level (warn
, error
and fatal
) are logged, that is debug
logging events are ignored.
log4j.logger.org.hibernate=info
or in http://wiki.apache.org/logging-log4j/Log4jXmlFormat">XML version of log4j config file:
<logger name="org.hibernate">
<level value="info"/>
</logger>
See also http://logging.apache.org/log4j/1.2/manual.html">log4j manual.
Solution 3 - Java
Executing:
java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.OFF);
before hibernate's initialization worked for me.
Note: the line above will turn every logging off (Level.OFF
). If you want to be less strict, you can use
java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);
that is silent enough. (Or check the java.util.logging.Level
class for more levels).
Solution 4 - Java
You can disabled the many of the outputs of hibernate setting this props of hibernate (hb configuration) a false:
hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments
But if you want to disable all console info you must to set the logger level a NONE of FATAL of class org.hibernate
like Juha say.
Solution 5 - Java
I finally figured out, it's because the Hibernate is using slf4j log facade now, to bridge to log4j, you need to put log4j and slf4j-log4j12 jars to your lib and then the log4j properties will take control Hibernate logs.
My pom.xml setting looks as below:
<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>
Solution 6 - Java
For disabling Hibernate:select
message in log, it is possible to set the property into HibernateJpaVendorAdapter
:
<bean id="jpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false"/>
</bean>
Solution 7 - Java
For those who don't want elegant solutions, just a quick and dirty way to stop those messages, here is a solution that worked for me (I use Hibernate 4.3.6 and Eclipse and no answers provided above (or found on the internet) worked; neither log4j config files nor setting the logging level programatically)
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
...
}
I used it in a tutorial program downloaded from this site
Solution 8 - Java
The first thing to do is to figure out which logging framework is actually used.
Many frameworks are already covered by other authors above. In case you are using Logback you can solve the problem by adding this logback.xml to your classpath:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<logger name="org.hibernate" level="WARN"/>
</configuration>
Further information: Logback Manual-Configuration
Solution 9 - Java
To disable printing hibernate queries in logs, just add this to your application.properties
spring.jpa.show-sql=false
Solution 10 - Java
I changed the "debug" to "info" and it worked. Here is what I did:
Before:
log4j.rootLogger=debug, stdout, R
After:
log4j.rootLogger=info, stdout, R
Solution 11 - Java
There are several parts of hibernate logging you can control based on the logger hierarchy of the hibernate package (more on logger hierarchy 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>
The above was taken from here.
Additionally you could have the property show-sql:true
in your configuration file since that supersedes the logging framework settings. More on that here.
Solution 12 - Java
I managed to stop by adding those 2 lines
log4j.logger.org.hibernate.orm.deprecation=error
log4j.logger.org.hibernate=error
Bellow is what my log4j.properties looks like, i just leave some commented lines explaining the log level
# 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
Solution 13 - Java
Replace slf4j-jdk14-xxx.jar with slf4j-log4j12-xxx.jar. If you have both, delete slf4j-jdk14-xxx.jar. Found this solution at https://forum.hibernate.org/viewtopic.php?f=1&t=999623
Solution 14 - Java
To get rid of logger output in console try this.
ch.qos.logback.classic.LoggerContext.LoggerContext loggerContext = (LoggerContext) org.slf4j.LoggerFactory.LoggerFactory.getILoggerFactory();
loggerContext.stop();
These statements disabled all the console outputs from logger.
Solution 15 - Java
In my case I had added the dependency
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.5.6.Final</version>
</dependency>
which was not necessary. I removed it and everything works perfectly