Logback - Quick Reference
When to Use This Skill
-
Configure logging in Spring Boot/Java applications
-
File appender with rotation
-
High-performance async logging
Deep Knowledge: Use mcp__documentation__fetch_docs with technology: logback for comprehensive documentation.
Configuration
logback-spring.xml (Spring Boot)
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="LOG_PATH" value="${LOG_PATH:-logs}"/>
<property name="LOG_FILE" value="${LOG_FILE:-app}"/>
<!-- Console Appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}</pattern>
</encoder>
</appender>
<!-- Rolling File Appender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${LOG_FILE}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- Async Appender -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE"/>
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
</appender>
<!-- Logger Configuration -->
<logger name="com.myapp" level="DEBUG"/>
<logger name="org.springframework" level="INFO"/>
<logger name="org.hibernate.SQL" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ASYNC"/>
</root>
<!-- Profile-specific -->
<springProfile name="prod">
<root level="WARN">
<appender-ref ref="ASYNC"/>
</root>
</springProfile>
</configuration>
JSON Format (ELK Stack)
<appender name="JSON" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <includeMdcKeyName>requestId</includeMdcKeyName> <includeMdcKeyName>userId</includeMdcKeyName> </encoder> </appender>
MDC Usage
import org.slf4j.MDC;
MDC.put("requestId", UUID.randomUUID().toString()); MDC.put("userId", user.getId()); try { // Business logic } finally { MDC.clear(); }
When NOT to Use This Skill
-
SLF4J API questions: Focus on API usage, not Logback implementation details
-
Log4j2 configuration: Different XML structure and features
-
Application code logging: Use SLF4J API, Logback is just the implementation
-
Non-Java projects: Use language-appropriate logging frameworks
-
Simple console output: System.out may be sufficient for basic scripts
Anti-Patterns
Anti-Pattern Why It's Bad Solution
Synchronous file appender in high-traffic Blocks application threads Use AsyncAppender wrapper
No rolling policy Logs fill disk space Use RollingFileAppender with size/time policies
Logging to console in production Performance overhead, lost logs Use file appenders, ship to centralized logging
DEBUG level in production Performance impact, disk usage Use INFO or WARN in production profiles
Not clearing MDC Memory leaks, wrong context in threads Always clear MDC in finally block
Hardcoded log paths Breaks across environments Use properties: ${LOG_PATH}
Quick Troubleshooting
Issue Cause Solution
Configuration not loaded Wrong file name/location Use logback-spring.xml in src/main/resources
Logs not rotating Missing rolling policy Add SizeAndTimeBasedRollingPolicy
Performance degradation Synchronous appenders Wrap with AsyncAppender
MDC values not appearing Pattern missing MDC placeholders Add %X{key} to pattern
Duplicate log entries Logger additivity enabled Set additivity="false" on logger
Profile-specific config ignored Using logback.xml instead Rename to logback-spring.xml for Spring profiles