How to configure Hibernate logging with log4j2
- Details
- Written by Nam Ha Minh
- Last Updated on 26 September 2019   |   Print Email
In this Hibernate tutorial, I will guide you how to configure your Java project to use log4j version 2.x with Hibernate framework.
By default, Hibernate uses JBoss logging API to print logging information to the standard console, something like this:
Besides the default logging, Hibernate also allows programmers to plugin external logging framework if they wish to have control over the logging process. And in this post, you will learn how to use log4j2 (log4j version 2.x) with Hibernate.
1. Specify log4j2 dependency
First, you need to add log4j2’s JAR files to the project’s classpath, namely log4j2-api-2.x.x.jar and log4j2-core-2.x.x.jar. You can download log4j2 JAR files here.
In case you use Maven, specify the following dependencies in the pom.xml file:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.12.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.12.1</version> </dependency>
When Hibernate detects log4j2’s JAR files present in the classpath, it will look for configuration file, either log4j2.xml or log4j2.properties.
2. Configure Hibernate logging using log4j2 via log4j2.xml file
Create the log4j2.xml file under the src/main/resources directory of your project as follows:
And put the following content in to the log4j2.xml file:
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <!-- Console Appender --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" /> </Console> </Appenders> <Loggers> <!-- Log everything in hibernate --> <Logger name="org.hibernate" level="info" additivity="false"> <AppenderRef ref="Console" /> </Logger> <!-- Log all SQL statements --> <Logger name="org.hibernate.SQL" level="debug" additivity="false"> <AppenderRef ref="Console" /> </Logger> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration>
This is a simple log4j configuration that prints log information to the standard output console (Console appender). Two Hibernate log categories used are org.hibernate and org.hibernate.SQL:
<!-- Log everything in hibernate --> <Logger name="org.hibernate" level="info" additivity="false"> <AppenderRef ref="Console" /> </Logger> <!-- Log all SQL statements --> <Logger name="org.hibernate.SQL" level="debug" additivity="false"> <AppenderRef ref="Console" /> </Logger>
You can see the complete list of Hibernate log categories here.
Run the project and you will see the default log format is replaced by log4j’s:
To also write log information to a file, use the following configuration:
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <!-- Console Appender --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" /> </Console> <!-- File Appender --> <File name="File" fileName="hibernate.log"> <PatternLayout pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" /> </File> </Appenders> <Loggers> <!-- Log everything in hibernate --> <Logger name="org.hibernate" level="info" additivity="false"> <AppenderRef ref="Console" /> <AppenderRef ref="File" /> </Logger> <!-- Log SQL statements --> <Logger name="org.hibernate.SQL" level="debug" additivity="false"> <AppenderRef ref="Console" /> <AppenderRef ref="File" /> </Logger> <Root level="error"> <AppenderRef ref="Console" /> <AppenderRef ref="File" /> </Root> </Loggers> </Configuration>
This will print all log information to the log file named hibernate.log, using the file appender:
<!-- File Appender --> <File name="File" fileName="hibernate.log"> <PatternLayout pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" /> </File>
To change the log layout pattern, refer to this tutorial.
3. Configure Hibernate logging using log4j via log4j2.properties file
In case you want to use properties file instead of XML, create the log4j2.properties file under the src/main/resources directory of your project as follows:
And put the following content:
appenders = console, file appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n appender.file.type = File appender.file.name = File appender.file.fileName = app.log appender.file.layout.type = PatternLayout appender.file.layout.pattern = [%-5level] %d{dd-MM-yyyy HH:mm:ss.SSS} [%t] %c{1} - %msg%n rootLogger.level = info rootLogger.appenderRefs = stdout rootLogger.appenderRef.stdout.ref = STDOUT rootLogger.appenderRef.file.ref = File logger.hibernate.name=org.hibernate.SQL logger.hibernate.level=debug
As you can see in this log4j2.properties file we use two appenders, one for console and one for file, and we specify a logger for the Hibernate log category org.hibernate.SQL that logs all SQL statements. You can see the complete list of Hibernate log categories here.
NOTE: If you use the log category org.hibernate.SQL, you should set the hibernate.show_sql property to false in Hibernate configuration file.
You can watch the video version below:
That’s how to enable Hibernate logging using log4j2. Check the following tutorials to learn more about Hibernate framework:
Other Hibernate Tutorials:
- Java Hibernate JPA Annotations Tutorial for Beginners
- Hibernate Hello World Tutorial for Beginners with Eclipse and MySQL
- Hibernate One-to-One Association on Primary Key Annotations Example
- Hibernate One-to-Many Using Join Table XML Mapping Example
- Hibernate Many-to-Many Association with Extra Columns in Join Table Example
- Hibernate Enum Type Mapping Example
- Hibernate Binary Data and BLOB Mapping Example
- Hibernate Basics - 3 ways to delete an entity from the datastore
- Hibernate Query Language (HQL) Example
- Java Hibernate Reverse Engineering Tutorial with Eclipse and MySQL
Comments