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%n ### direct 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=trac5116 Answers
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.
Spring
(tested with spring-boot 3.0.6 and hibernate 5.6.15)
If you're using Spring Boot with properties file:
spring.jpa.properties.hibernate.show_sql=false 5Try 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 XML version of log4j config file:
<logger name="org.hibernate"> <level value="info"/> </logger> See also log4j manual.
7Executing:
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).
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.
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> 1For disabling Hibernate:select message in log, it is possible to set the property into HibernateJpaVendorAdapter:
<bean> <property name="showSql" value="false"/> </bean> 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
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
To disable printing hibernate queries in logs, just add this to your application.properties
spring.jpa.show-sql=false The @DataJpaTest annotation from Spring Boot Test Auto-Configure enables SQL output by default. To disable SQL output when using that annotation in tests, change
@DataJpaTest public class MyTestClass { ... } to
@DataJpaTest(showSql = false) public class MyTestClass { ... } 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 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.
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 Replace slf4j-jdk14-xxx.jar with slf4j-log4j12-xxx.jar. If you have both, delete slf4j-jdk14-xxx.jar. Found this solution at
1To 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.
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