SpringBoot Tips - Part 2

Managing Application Configuration
in the Right Way!

SpringBoot Configuration Options
(Enough for most cases)

  1. Default values
    Ex: application.properties
  2. Profile specific overrides
    Ex: application-{profile}.properties
  3. Environment Variables
    Ex: SERVER_PORT=9090

Logging in SpringBoot Applications

  • A quick look at Logging before SpringBoot
  • SpringBoot Default Logging Support
  • Customising Logging Configuration
  • Profile specific logging configuration
  • Logging Best Practices

Logging in Java

  • Java Util Logging
  • commons-logging
  • Log4j
  • Logback
  • Log4j2
  • JBoss Logging
  • SLF4J (A facade to other logging providers)

Good old days of Logging

Logging with library specific configuration

                
                   private static Logger logger = Logger.getLogger(MyClass.class);
                
            

log4j.properties

                    
                        log4j.rootLogger=INFO, stdout
                        # 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
                    
                

log4j.xml

                    
                        
                    
                

logback.xml

                    
                        
                    
                

SpringBoot Logging

  • Default Logging with SLF4J & Logback
  • Can switch to Log4J2
  • No need to create logging config (properties or XML) files

SpringBoot Logging Configuration

application.properties

                    
                        #Log Levels: TRACE > DEBUG > INFO > WARN > ERROR
                        logging.level.root=INFO
                        logging.level.org.springframework=WARN
                        logging.level.org.hibernate=DEBUG
                        # Log groups
                        logging.group.sivalabs=com.sivalabs,org.sivalabs
                        logging.level.sivalabs=DEBUG
                        logging.pattern.console=%d{yyyy-MM-dd}-%t-%x-%-5p-%-10c:%m%n
                        logging.file.name=myapp.log
                    
                

SpringBoot Logback Extensions

logback-spring.xml

                
                    
                
            

Logging Best Practices

  • Use CorrelationID / TrackingID with MDC
  • Don’t log sensitive data
  • Check for isDebugEnabled() / isTraceEnabled()
  • Structured Logging (JSON)
  • Distributed Tracing - Spring Cloud Sleuth
  • ELK/EFK Stack

Types of Tests

  • Unit Tests
  • Integration Tests
  • E2E Tests
  • Performance Tests

Unit Tests

  • Test business logic
  • Identify your Unit
  • Mockist vs Classical testing strategy

Unit Tests that doesn't need framework support

  • No Mocks (Preferred)
  • Mockito

Slice Tests

Unit Tests that need framework support

  • @WebMvcTest
  • @DataJpaTest
  • @DataJdbcTest
  • @DataMongoTest

Integration Tests

  • @SpringBootTest
  • Custom Slices

Exception Handling

  • Traditional Web Applications
  • REST APIs

Exception Handling In SpringBoot REST APIs

  • Using try-catch
  • Using @ExceptionHandler at Controller level
  • Using @ControllerAdvice at global level

Problem Spring Web Starter

                
                    
                        org.zalando
                        problem-spring-web-starter
                        ${problem-spring-web.version}
                    
                
            

Spring Boot Actuator

                
                    
                        org.zalando
                        problem-spring-web-starter
                        ${problem-spring-web.version}
                    
                
            

Spring Boot Admin

  • Show health status
  • Show details, like
    • JVM & memory metrics
    • micrometer.io metrics
    • Datasource metrics
    • Cache metrics
  • View Spring Boot Configuration Properties
  • Easy loglevel management
  • and, many more....

Spring Boot REST API documentation

using springdoc-openapi