Interview question
What are logging best practices in Spring Boot? How do you configure Logback? Spring Boot में logging best practices क्या हैं? Logback कैसे configure करते हैं?
Answer
Use SLF4J facade with Logback implementation. Configure different log levels, outputs, and patterns. Use contextual logging for request tracking. Implement proper log rotation to prevent disk space issues.
// logback-spring.xml
<?xml version='1.0' encoding='UTF-8'?>
<configuration>
<property name='LOG_PATTERN'
value='%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n'/>
<property name='LOG_FILE' value='logs/app.log'/>
<!-- Console Appender -->
<appender name='CONSOLE' class='ch.qos.logback.core.ConsoleAppender'>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- File Appender with Rotation -->
<appender name='FILE' class='ch.qos.logback.core.rolling.RollingFileAppender'>
<file>${LOG_FILE}</file>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class='ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy'>
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- Logger Configuration -->
<logger name='com.example.app' level='DEBUG'/>
<logger name='org.springframework' level='INFO'/>
<logger name='org.hibernate' level='WARN'/>
<!-- Root Logger -->
<root level='INFO'>
<appender-ref ref='CONSOLE'/>
<appender-ref ref='FILE'/>
</root>
</configuration>
// application.yml - Dynamic Log Levels
logging:
level:
root: INFO
com.example.app: DEBUG
org.springframework.web: DEBUG
org.hibernate: WARN
file:
name: logs/app.log
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n'
file: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n'
// Structured Logging with SLF4J
public class OrderService {
private static final Logger logger = LoggerFactory.getLogger(OrderService.class);
public void processOrder(String orderId, String customerId) {
// Contextual logging
MDC.put('orderId', orderId);
MDC.put('customerId', customerId);
try {
logger.info('Processing order started');
// Business logic
logger.info('Order processed successfully');
} catch (Exception e) {
logger.error('Error processing order', e);
} finally {
MDC.clear();
}
}
}
// Async Logging (high throughput)
<appender name='ASYNC_FILE' class='ch.qos.logback.classic.AsyncAppender'>
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref='FILE'/>
</appender>
// Best Practices:
// 1. Use SLF4J - facade pattern
// 2. Set appropriate log levels
// 3. Implement log rotation
// 4. Use async logging for performance
// 5. Structured logging with MDC
// 6. Never log passwords/secrets
// 7. Use appropriate log levels (DEBUG < INFO < WARN < ERROR)Logging Best Practices:
1. Use SLF4J (not System.out.println)
2. Set levels: DEBUG < INFO < WARN < ERROR
3. Configure in logback-spring.xml
4. Implement log rotation (prevent disk full)
5. Use async logging (performance)
Logback Configuration:
- Console appender (dev)
- File appender (production)
- Rolling policy (size/time based)
- Encoder pattern
Structured Logging:
MDC (Mapped Diagnostic Context)
Add orderId, customerId context
Track requests end-to-end
Rotation Policy:
- Max file size: 10MB
- Max history: 30 days
- Async appender: 512 queue size
Security:
- Never log passwords
- Never log sensitive data
- Mask PII (Personal Identifiable Info)Was this answer clear?