1. Introduction
In this tutorial, we’ll discuss logging in Spring Boot. Spring Boot makes it very easy to implement logging in application. You can use all popular logging frameworks like Commons Logging, Log4J, or SLF4J with Spring Boot. Spring Boot makes it very easy to use logging frameworks and comes with default configurations. Generally, you’ll not need to change default but you can if you want to you can do without much effort
2. Default logging
- For internal logging, Spring Boot uses Commons Logging.
- Default configurations are provided for Logback, Java Util Logging and Log4J2.
- Loggers are by default configured to use Console.
- If you are using
starter
dependencies, Logback is by default used for logging. - By default,
ERROR
,WARN
andINFO
level messages are logged.
3. Log Levels
There are following levels:
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
- FATAL
- OFF
Logger levels are configured in application.properties
. The format of the property to set logging level is:
logging.level.<logger-name>=<level>
Here, level
could be any value mentioned above.
The root logger can be configured by using logging.level.root
.
Following is the example of configuring logger in application.properties
:
logging.level.org.springframework.web=debug logging.level.org.hibernate=error
If you are using application.yaml
:
logging: level: org.springframework.web: "debug" org.hibernate: "error"
4. Log Format
The default log format is similar to the following:
2021-11-28 00:09:08.620 INFO 1988 --- [ main] c.l.l.LazyInitializationDemoApplication : No active profile set, falling back to default profiles: default 2021-11-28 00:09:10.096 INFO 1988 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
Lets analyze the log format.
2021-11-28 00:09:08.620 | This represents the date and time with millisecond precision. |
INFO | This is the log level. The log level could be ERROR , WARN , INFO , DEBUG , or TRACE . Logback does not have FATAL level. FATAL level is same as ERROR . |
1988 | This is the process ID. |
– – – | This is the separator |
[ main] | This is the thread name enclosed in square brackets. |
c.l.l.LazyInitializationDemoApplication | This is the logger name. It is usually the source class name. |
No active profile set, falling back to default profiles: default | This is the log message. |
5. Console output
By default, ERROR
, WARN
and INFO
level messages are logged. But you can configure to log DEBUG
and TRACE
messages. You can set the DEBUG
level to true
in application.properties
or use debug
flag while starting application. With DEBUG mode, you see more information logged in by container, Hibernate and Spring Boot.
6. Colored output
You can set spring.output.ansi.enabled
property to enable color output if your terminal supports ANSI. Following is the mapping of colors with log levels:
Level | Color |
FATAL | Red |
ERROR | Red |
WARN | Yellow |
INFO | Green |
DEBUG | Green |
TRACE | Green |
Example
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){red}
This will print messages in red color.
7. Custom Log configurations
Spring allows you to use different logging frameworks. To use a logging system with Spring, you have to include appropriate libraries in classpath. Different logging systems come with a configuration file which can be used to customize logging system. For example, Log4j2 expects log4j2.xml
file. Configuration file should be in the root of the classpath. The configuration can also be specified using logging.config
property.
Note: The property org.springframework.boot.logging.LoggingSystem
is used to define custom logging system. The value is the fully qualified class name of a LoggingSystem
implementation.
Following are the customization files for the logging system:
Logback | logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
We’ll see examples of using these logging system with Spring Boot later.
8. Log messages to file
By default, Spring logs only to the console. However, you can log to a file as well in a specific directory. Following properties are used to configure log file and log file directory:
logging.file.name
: The name of the log file. The log file could be absolute or relative to the current directory. For example,myApplication.log
.logging.file.path
: The directory to which logs are written. The path of the directory could be absolute or relative to the current directory. For example,/var/log
.
9. File rotation
Following are important points about file rotation:
- Log files rotate when they reach 10 MB.
- If you are using Logback in your application, then rotation can be configured using
application.properties
orapplication.yaml
. For any other logging framework, you have to do it of your own.
Following are properties for rotation policy:
logging.logback.rollingpolicy.file-name-pattern | The filename pattern to log archives. |
logging.logback.rollingpolicy.clean-history-on-start | To set if archive cleanup should occur when the application starts. |
logging.logback.rollingpolicy.max-file-size | The maximum size of log before it’s archived. |
logging.logback.rollingpolicy.total-size-cap | The maximum size of log archives after which it is deleted. |
logging.logback.rollingpolicy.max-history | The number of days for which the logs are retained. The default value is 7. |
10. Log Groups
Sometimes you may want to group related loggers together. For example, you may want to configure all tomcat loggers together. This will help you to configure loggers easily.
Following is an example of how you can define a group tomcat
in application.properties
.
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
If you are using Yaml:
logging: group: tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
Once the log group is defined, log level can be defined like the following in application.properties
:
logging.level.tomcat=trace
And if you are using Yaml:
logging: level: tomcat: "trace"
Spring Boot includes web
and sql
pre-defined logging groups.
11. Log shutdown hook
A log shutdown hook is registered automatically when the application starts. The purpose of the log shutdown hook is to release logging resources when application terminates. You can disable this shutdown hook by using logging.register-shutdown-hook
property:
logging.register-shutdown-hook=false
12. Profile-specific Logging Configuration
You can use <springProfile>
tag to optionally include or exclude sections of configuration based on active Spring profiles. The name
attribute of this tag can have profile name or a profile expression as a value. This can be demonstrated with the help of following example:
<springProfile name="staging"> <!-- configuration to be enabled when the "staging" profile is active --> </springProfile> <springProfile name="dev | staging"> <!-- configuration to be enabled when the "dev" or "staging" profiles are active --> </springProfile> <springProfile name="!production"> <!-- configuration to be enabled when the "production" profile is not active --> </springProfile>
13. Conclusion
In this tutorial, we touched concepts of logging in Spring Boot. This tutorial has taken reference from Spring Boot official documentation. We suggest you to read official documentation for further clarification and if you want to learn Spring Boot in depth.