slf4j

Original🇺🇸 English
Translated

SLF4J - Simple Logging Facade for Java. Standard logging API that abstracts underlying implementation (Logback, Log4j2). Provides parameterized logging and MDC support. USE WHEN: user mentions "slf4j", "java logging api", "parameterized logging", asks about "how to log in Java", "logger facade", "MDC in java", "logging best practices java" DO NOT USE FOR: Logback configuration - use `logback` instead, Log4j2 configuration - use Log4j2 skill, Node.js logging - use `winston` or `pino` instead, Python logging - use `python-logging` instead

2installs
Added on

NPX Install

npx skill4agent add claude-dev-suite/claude-dev-suite slf4j

Tags

Translated version includes tags in frontmatter

SLF4J - Quick Reference

When to Use This Skill

  • Standard logging API for Java
  • Integration with Logback, Log4j2
  • Java logging best practices
Deep Knowledge: Use
mcp__documentation__fetch_docs
with technology:
slf4j
for comprehensive documentation.

Essential Patterns

Logger Declaration

java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class UserService {
    private static final Logger log = LoggerFactory.getLogger(UserService.class);

    // Or with Lombok
    // @Slf4j on class
}

Logging Levels

java
log.trace("Detailed debug info: {}", details);
log.debug("Debug info for development");
log.info("Normal operation: user {} logged in", userId);
log.warn("Potential problem: {} retries remaining", retries);
log.error("Error occurred: {}", message, exception);

Parameterized Logging

java
// Good - lazy evaluation
log.debug("Processing order {} for user {}", orderId, userId);

// Avoid - always evaluates
log.debug("Processing order " + orderId + " for user " + userId);

// Multiple parameters
log.info("User {} performed {} on resource {}", userId, action, resourceId);

Exception Logging

java
try {
    processOrder(order);
} catch (OrderException e) {
    // Exception is always last parameter
    log.error("Failed to process order {}: {}", order.getId(), e.getMessage(), e);
}

MDC (Mapped Diagnostic Context)

java
import org.slf4j.MDC;

// Set context
MDC.put("requestId", requestId);
MDC.put("userId", userId);

try {
    // All logs in this scope will include requestId and userId
    log.info("Processing request");
} finally {
    MDC.clear();
}

Conditional Logging

java
if (log.isDebugEnabled()) {
    log.debug("Expensive computation result: {}", expensiveMethod());
}

// Better with lambdas (SLF4J 2.0+)
log.atDebug().log(() -> "Result: " + expensiveMethod());

Fluent API (SLF4J 2.0+)

java
log.atInfo()
   .addKeyValue("orderId", orderId)
   .addKeyValue("amount", amount)
   .log("Order processed successfully");

When NOT to Use This Skill

  • Logging framework configuration: Use
    logback
    or Log4j2 skills for XML/config
  • Performance tuning: Configuration-level optimization is in implementation skills
  • Transport/appender setup: That's implementation-specific (Logback/Log4j2)
  • Non-Java projects: Use language-appropriate logging APIs
  • Direct implementation usage: Always code to SLF4J API, not Logback/Log4j2 directly

Anti-Patterns

Anti-PatternWhy It's BadSolution
String concatenation in logsAlways evaluated, performance hitUse parameterized logging:
log.info("User {}", id)
Logging without level check for expensive opsWastes CPU even when disabledUse
if (log.isDebugEnabled())
before expensive calls
Catching exceptions without loggingSilent failures, hard to debugAlways log with
log.error("msg", exception)
Not using MDC for request contextLoses correlation across logsUse
MDC.put()
with try-finally
Using wrong log levelToo much noise or missing issuesFollow conventions: ERROR=requires action, WARN=potential issue
Logging sensitive dataSecurity/compliance violationMask PII, passwords, tokens before logging

Quick Troubleshooting

IssueCauseSolution
NoClassDefFoundError: StaticLoggerBinderNo SLF4J implementation on classpathAdd Logback or Log4j2 dependency
Multiple bindings warningMultiple SLF4J implementationsKeep only one: Logback OR Log4j2
Logs not appearingWrong log levelCheck implementation config (logback.xml)
Parameters not replacedWrong placeholder syntaxUse
{}
not
%s
or other formats
MDC values emptyMDC cleared or wrong threadEnsure MDC.put() before logging, clear in finally
Exception stack trace missingException not last parameterPut exception as last param:
log.error("msg", e)