Configure Hibernate Logging with SLF4j + Logback

This tutorial shows how to configure hibernate with SLF4j and Logback. Logging is an important tool for each developer. So it’s worth setting up right the first time. We configure Logback with a ConsoleAppender for logging to the console and a RollingFileAppender for logging to a file for archival. If you stick around, we’ll also show you how to remove the annoying c3p0 logging.

Maven Dependencies

We are using Apache Maven to manage the projects dependencies. Add the following dependencies to your projects pom.xml file.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.4</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.3.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>5.2.3.Final</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>

Project Structure

Make sure the configuration files like logback.xml and mchange-log.properties resides on the classpath in the src/main/resources folder.

src
|    +--main
|        +--java
|            +--com
|                +--memorynotfound
|                    +--hibernate
|                        |--App.java
|                        |--Book.java
|                        |--HibernateUtil.java
|        +--resources
|            |--Hibernate.cfg.xml
|            |--logback.xml
|            |--mchange-log.properties
pom.xml

Logback Configuration

In the logback.xml file, we can configure Logback. In this example we define two loggers. The first ch.qos.logback.core.ConsoleAppender will write the output to the console. The second ch.qos.logback.core.rolling.RollingFileAppender will write the output to a file for archival reasons. We can specify the log level using the logger element. In this element we can provide a package name to manage the log level of that specific package.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{yyyy-MM-dd_HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>mylog.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>

        <encoder>
            <pattern>%d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.hibernate" level="INFO" />
    <logger name="com.memorynotfound" level="DEBUG" />

    <root level="WARN">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

Disabling c3p0 Info Logging

When you don’t want the c3p0 info logging information, you can disable this by creating a mchange-log.properties file in the src/main/resources folder. In this file you can specify the following properties. These will disable the info logging and only log WARNING messages.

com.mchange.v2.log.MLog=com.mchange.v2.log.FallbackMLog
com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=WARNING

Output

The following output is an example of the log, created by logback.

2016-10-12_09:49:38.185 INFO  org.hibernate.Version - HHH000412: Hibernate Core {5.2.3.Final}
2016-10-12_09:49:38.189 INFO  org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
2016-10-12_09:49:38.191 INFO  org.hibernate.cfg.Environment - HHH000021: Bytecode provider name : javassist
2016-10-12_09:49:38.384 INFO  o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2016-10-12_09:49:38.501 INFO  o.h.c.i.C3P0ConnectionProvider - HHH010002: C3P0 using driver: com.mysql.cj.jdbc.Driver at URL: jdbc:mysql://localhost:3306/bookstore?serverTimezone=Europe/Brussels
2016-10-12_09:49:38.501 INFO  o.h.c.i.C3P0ConnectionProvider - HHH10001001: Connection properties: {user=root, password=****}
2016-10-12_09:49:38.501 INFO  o.h.c.i.C3P0ConnectionProvider - HHH10001003: Autocommit mode: false
2016-10-12_09:49:38.643 INFO  o.h.c.i.C3P0ConnectionProvider - HHH10001007: JDBC isolation level: 
2016-10-12_09:49:38.930 INFO  org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
2016-10-12_09:49:38.977 INFO  o.h.e.j.e.i.LobCreatorBuilderImpl - HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
2016-10-12_09:49:39.446 INFO  org.hibernate.orm.connections.access - HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$C[email protected]] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
2016-10-12_09:49:39.459 INFO  org.hibernate.orm.connections.access - HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$C[email protected]] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
2016-10-12_09:49:39.474 INFO  o.h.t.s.internal.SchemaCreatorImpl - HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExis[email protected]'
2016-10-12_09:49:39.554 DEBUG com.memorynotfound.hibernate.App - creating new book
2016-10-12_09:49:39.555 DEBUG com.memorynotfound.hibernate.App - saving new book
2016-10-12_09:49:39.587 DEBUG com.memorynotfound.hibernate.App - committing transaction
2016-10-12_09:49:39.591 DEBUG com.memorynotfound.hibernate.App - closing session
2016-10-12_09:49:39.592 DEBUG com.memorynotfound.hibernate.App - shutting down
2016-10-12_09:49:39.593 INFO  o.h.t.s.i.SchemaDropperImpl$DelayedDropActionImpl - HHH000477: Starting delayed drop of schema as part of SessionFactory shut-down'
2016-10-12_09:49:39.593 INFO  org.hibernate.orm.connections.access - HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$C[email protected]] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.

References

Download

You may also like...