Introduction
Spring Boot applications can save informative messages or application errors to a file. This functionality allows you to monitor the application’s health and take necessary action when problems arise.
Logging all of this information to a single file, on the other hand, will cause the file to expand in size, which would be a nightmare if the file size rose to MB or GB and you wanted to trace a specific exception throughout the whole log file.
Therefore, each logging library provides a feature to distribute application logs into an n-number of files.
And in this tutorial, we’ll look into a Log4j2
functionality like that.
This feauture is names as RollingFile Appender
in Log4j2.
RollingFile Configuration
Log4j2’s RollingFile
appender setting allows you to separate logs based on date and time, size, or both rules.
To begin with the initial setup of log4j, please see the Two Steps To Add Log4j2 To Spring Boot Application tutorial.
Now, to apply the RollingFile configuration, modify the log4j2.xml
file.
src/main/resources/log4j2-rolling-file.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR">
<Properties>
<Property name="LOG_PATTERN">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"</Property>
<Property name="LOG_DIR">logs</Property>
<Property name="LOG_FILE_NAME">logging</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="dailyFileLog"
fileName="${LOG_DIR}/${LOG_FILE_NAME}.log"
filePattern="${LOG_DIR}/${LOG_FILE_NAME}-%d{dd-MM-yyyy}.log">
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.zainabed" level="INFO">
<AppenderRef ref="dailyFileLog"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
The “RollingFile” setup will be in charge of breaking logs into different log files. It has the following characteristics:
- name: the name of the RollingFile configuration to be used in the Logger tag.
- fileName: path to the system log file.
- filePattern: pattern for creating rolling log files.
The policy for splitting files is defined in the preceding code snippet. Here, the policy indicates that logs should be distributed based on a time-based policy.
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
Note: Log4j2 creates files based on
filePattern
, and you can find previous days’ logs according to those patterns.
Result
You can put everything together and run application.
$ ls logs/
logging.log
And if you run the same application the next day, old logs are archived and saved in a file that conforms to the pattern specified in the RollingFile setting.
$ ls logs/
logging-08-11-2022.log logging.log
logging-08-11-2022.log
contains logs of 8/11/2022 and logging.log
will contain current days log.
YAML configuration
The same configurations can be established using an application. yml file as,
src/main/resources/log4j2-rolling-file.yml
Configutation:
status: warn
Properties:
Property:
- name: LOG_DIR
value: logs
- name: LOG_FILE_NAME
value: logging
Appenders:
Console:
name: CONSOLE
target: SYSTEM_OUT
PatternLayout:
Pattern: "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
RollingFile:
- name: APPLICATION
fileName: "${LOG_DIR}/${LOG_FILE_NAME}.log"
filePattern: "${LOG_DIR}/${LOG_FILE_NAME}-%d{dd-MM-yyyy}.log"
PatternLayout:
Pattern: "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
policies:
TimeBasedTriggeringPolicy:
interval: 1
modulate: true
Loggers:
Root:
level: info
AppenderRef:
- ref: CONSOLE
- ref: APPLICATION
Logger:
- name: com.zainabed
additivity: false
level: info
AppenderRef:
- ref: CONSOLE
- ref: APPLICATION
- name: com.myco.myapp.Bar
additivity: false
level: debug
AppenderRef:
- ref: CONSOLE
- ref: APPLICATION
Conclusion
Congratulation! You’ve learned about Log4j2’s RollingFile appender, and as always, the source code for this tutorial can be found on Github.