DEV Community

Plabon Kumar saha
Plabon Kumar saha

Posted on

Log4j2 in Spring boot

In the dynamic world of fintech, where thousands of transactions per hour demand seamless operations, backend engineers play a pivotal role in ensuring systems' high availability and reliability. One indispensable tool in their arsenal is comprehensive logging, which serves as the backbone for identifying, troubleshooting, and optimizing critical financial applications. Detailed logs can help trace the execution flow, pinpoint errors, and understand the context of unexpected behaviors. Not only do these logs help to monitor performance, auditing system health checks. Thus I was tasked to implement log4j. The implementation details are below.

Dependency

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</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>
   <version>2.5.5</version>
  </dependency>

  <dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-layout-template-json</artifactId>
   <version>2.14.1</version>
  </dependency>
  <dependency>
   <groupId>net.logstash.logback</groupId>
   <artifactId>logstash-logback-encoder</artifactId>
   <version>6.6</version>
  </dependency>
Enter fullscreen mode Exit fullscreen mode

The Usage of logs

LoggerFactory.getLogger(getClass()).info(message);
LoggerFactory.getLogger(getClass()).debug(message);
LoggerFactory.getLogger(getClass()).error(message);
Enter fullscreen mode Exit fullscreen mode

*Add an XML file named logback.xml like below
*

<configuration>
    <appender name="jsonConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
    <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp/>
                <pattern>
                    <pattern>
                        {
                        "level": "%level",
                        "logger": "%logger",
                        "message": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>ms-identity-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <cleanHistoryOnStart>false</cleanHistoryOnStart>
        </rollingPolicy>
    </appender>


    <root level="INFO">
        <appender-ref ref="jsonConsoleAppender"/>
        <appender-ref ref="RollingFile" />

    </root>
</configuration>
Enter fullscreen mode Exit fullscreen mode

*If you want to store logs in files.
*

<configuration>
    <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp/>
                <pattern>
                    <pattern>
                        {
                        "level": "%level",
                        "logger": "%logger",
                        "message": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>application-name-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <cleanHistoryOnStart>false</cleanHistoryOnStart>
        </rollingPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="RollingFile" />
    </root>
</configuration>
Enter fullscreen mode Exit fullscreen mode

*Store logs in DB
*

   CREATE TABLE `logging` (
  `EVENT_ID` int(11) NOT NULL AUTO_INCREMENT,
  `EVENT_DATE` datetime DEFAULT NULL,
  `LEVEL` varchar(45) DEFAULT NULL,
  `LOGGER` varchar(45) DEFAULT NULL,
  `MSG` varchar(45) DEFAULT NULL,
  `THROWABLE` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`EVENT_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Enter fullscreen mode Exit fullscreen mode
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
 <Appenders>
  <Console name="Console" target="SYSTEM_OUT">
   <PatternLayout
    pattern="%d{HH:mm:ss.SSS} $${env:JournalDevVar} $${env:JournalDevSecondVar} [%t] %-5level %logger{36} - %msg%n" />
  </Console>
  <JDBC name="databaseAppender" tableName="journaldev.logging">
   <DataSource jndiName="java:/comp/env/jdbc/JournalDevDB" />
   <Column name="EVENT_DATE" isEventTimestamp="true" />
   <Column name="LEVEL" pattern="%level" />
   <Column name="LOGGER" pattern="%logger" />
   <Column name="MSG" pattern="%message" />
   <Column name="THROWABLE" pattern="%ex{full}" />
  </JDBC>
 </Appenders>
 <Loggers>
  <Root level="ERROR">
   <AppenderRef ref="Console" />
  </Root>
  <logger name="com" level="TRACE" additivity="false">
   <AppenderRef ref="databaseAppender" />
  </logger>
  <logger name="com.journaldev" additivity="false">
   <AppenderRef ref="databaseAppender" />
  </logger>
 </Loggers>
</Configuration>
Enter fullscreen mode Exit fullscreen mode

Image of Datadog

How to Diagram Your Cloud Architecture

Cloud architecture diagrams provide critical visibility into the resources in your environment and how they’re connected. In our latest eBook, AWS Solution Architects Jason Mimick and James Wenzel walk through best practices on how to build effective and professional diagrams.

Download the Free eBook

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay