How to Change Log Level in Spring Boot
Spring boot has no mandatory dependency on any of the logging implementations. Spring boot only depends on commons logging API interface. Commons logging API is a very thin bridge between logging clients and logging implementations. This enables application and framework writers to decouple application logging from actual logging implementations. Spring boot follows this approach and uses the jcl-over-slf4j library for commons logging API interface. The enables backward compatibility to commons logging API but at the same time provides all the benefits of the new SLF4J API. This interface can be used to integrate any of the popular logging implementations such as Logback, Log4j2 or JDK logging.
If you are using any of the spring boot starter projects such as spring-boot-starter-web, it has a dependency on spring-boot-starter-logging. This starter library has a dependency on Logback logging library. The SLF4J API detects and configures Logback as the default logging implementation. Logback is considered to be successor to the popular log4j logging framework. Following are some of the benefits of Logback over log4J,
- Logback is substantially faster than log4j and takes up less memory.
- Logback has support for automatic reloading of configuration files.
- With an exhaustive test suite, Logback is considered as a rock solid logging framework. This is very important since a logging framework is used across the application.
- Logback-classic is a native implementation of the newer SLF4J API.
- Built-in support for automatic removal of old logs and compression of the archival logs.
- Built-in support for conditional processing of configuration files.
How to Change Log Level in Spring Boot Applications
The default out of the box logging configuration used by spring boot starter projects prints messages to the console. By default only ERROR, WARN and INFO messages are logged.
If you only want to change the log levels of various packages, you can configure it in the application.properties. For example, the following entries change the log level of all spring framework classes to ERROR and all the classes under the package com.quickprogrammingtips to DEBUG. We also sets the root logger to WARN.
# application.properties values logging.level.root=WARN logging.level.org.springframework=ERROR logging.level.com.quickprogrammingtips=DEBUG
When you run with the above configuration, you will notice that very limited logging output is seen on the console. This is because we have the root logger to WARN and spring framework classes to ERROR. Following is hierarchy of log levels in commons logging,
ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF
However for fine grained changes to Logback logging configuration, you can add a custom Logback configuration file (logback.xml) to the src/main/resources folder. It will be automatically picked up by spring boot. The following sample file shows how the logging levels can be set without using application.properties,
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <logger name="org.springframework" level="ERROR" /> <logger name="root" level="WARN" /> <logger name="com.quickprogrammingtips" level="DEBUG" /> </configuration>
If you want to use spring boot templating features in logback configuration, create a file named logback-spring.xml instead of logback.xml. Much more complex customization is possible using logback-spring.xml. See spring boot documentation for more details.
How to Use Logging in Spring Boot Application Code
The preferred interface for calling log methods in spring boot is SLF4J API. However you can also use commons logging API. The following classes show how each API can be used for logging. Note that the actual logging implementation is selected based on what is available on the classpath. As mentioned earlier, if you are using starter projects, Logback is default implementation (other options are Log4j2 and JDK logging).
Using SLF4J API for Logging in Spring Boot Application Classes
package com.quickprogrammingtips.springboot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloWorldController { private static final Logger LOG = LoggerFactory.getLogger(HelloWorldController.class); @RequestMapping("/hello") @ResponseBody String home() { LOG.info("sending hello world response..."); return "Hello World!"; } }
Using Commons Logging API in Spring Boot Application Classes
package com.quickprogrammingtips.springboot; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloWorld2Controller { private static final Log LOG = LogFactory.getLog(HelloWorldController.class); @RequestMapping("/hello2") @ResponseBody String home() { LOG.info("sending hello world 2 response..."); return "Hello World!"; } }