1

I am learning SpringBoot using this very good example here.

But one thing I wanted to learn how to add into this project is RollingFileAppender.

In my previous projects I always did the following:

1) Added these dependencies

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>

2) Add the following file log4j.properties in the src/main/resources folder.

# Root logger option
log4j.rootLogger=INFO, stdout, loggerId

log4j.appender.loggerId=org.apache.log4j.RollingFileAppender  
log4j.appender.loggerId.layout=org.apache.log4j.PatternLayout  
log4j.appender.loggerId.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n  
log4j.appender.loggerId.File=logs/app.log
log4j.appender.loggerId.MaxFileSize=100MB
log4j.appender.loggerId.MaxBackupIndex=30

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Silence unnecessary logs
log4j.logger.net.schmizz=OFF
log4j.logger.io.javalin=OFF
log4j.logger.net.dv8tion.jda.core.requests=OFF

3) In the code I can just invoke the logger:

private Logger LOG = LoggerFactory.getLogger(<class>)

(...)

LOG.info("logging a message")

And this would throw up logs to the console, and to a rolling file called logs/app.log with maximum size of 100MB (as defined in the properties file).

What is the correct way for doing this, in modern SpringBoot projects like the one I linked above in GitHub, possibly using the logger that comes with SpringBoot?

Thanks!

PedroD
  • 5,670
  • 12
  • 46
  • 84

1 Answers1

2

Logging in Spring Boot isn't fundamentally different than in a vanilla Java project. Spring Boot uses Commons Logging for all internal logging but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging, Log4J2, and Logback. In each case, loggers are pre-configured to use console output with optional file output also available. By default, if you use the “Starters”, Logback is used for logging.1

If you want to stick with Log4J2, you'll have to exclude the default Logback dependency and include Log4J2:

<!-- exclude logback , add log4j2 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

Then add a new file called log4j2.xml or (log4j2.properties) in src/main/resources

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="loggerId" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="logs/app.log"/>
        <param name="MaxBackupIndex" value="30"/>
        <param name="MaxFileSize" value="100MB"/>
        <layout class="org.apache.log4j.PatternLayout  ">
            <param name="ConversionPattern" value="%d [%t] %-5p (%F:%L) - %m%n"/>
        </layout>
    </appender>
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
        </layout>
    </appender>
    <logger name="io.javalin">
        <level value="OFF"/>
    </logger>
    <logger name="net.dv8tion.jda.core.requests">
        <level value="OFF"/>
    </logger>
    <logger name="net.schmizz">
        <level value="OFF"/>
    </logger>
    <root>
        <level value="INFO"/>
        <appender-ref ref="stdout"/>
        <appender-ref ref="loggerId"/>
    </root>
</configuration>

For more information, baeldung.com is my goto place for good to-the-point tutorials on how to do this stuff. Since you're asking specifically for advice on Rolling File Appenders, I recommend A Guide to Rolling File Appenders. There's also a more generic article on Logging in Spring Boot.

Personally, I like to use Lombok annotations like @Slf4j to get rid of the logging boilerplate and prevent copy-and-paste mistakes.

Code on!

Martin Devillers
  • 17,293
  • 5
  • 46
  • 88