Simple Logging Facade for Java (SLF4J) API - a facade/abstraction layer for various logging frameworks.
npx @tessl/cli install tessl/maven-org-slf4j--slf4j-api@2.0.0SLF4J (Simple Logging Facade for Java) is a logging facade that serves as an abstraction layer for various Java logging frameworks including java.util.logging, logback, reload4j, log4j 2.x, and logevents. The API allows developers to write logging code independent of any specific logging implementation, enabling runtime pluggability of logging frameworks.
SLF4J 2.0 introduces a modern fluent API while maintaining full backward compatibility with the traditional 1.x API.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.17</version>
</dependency>import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;For event-based logging (SLF4J 2.0):
import org.slf4j.event.Level;
import org.slf4j.spi.LoggingEventBuilder;
import java.util.function.Supplier;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass {
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
public void doSomething() {
// Traditional logging
logger.info("Starting processing");
logger.debug("Processing item: {}", item.getName());
logger.warn("Issue detected: {}", issue);
logger.error("Failed to process", exception);
// Fluent API (SLF4J 2.0)
logger.atInfo()
.addArgument(user.getId())
.addKeyValue("action", "login")
.log("User {} logged in");
}
}SLF4J consists of several key components:
Traditional logging interface with methods for all standard log levels (TRACE, DEBUG, INFO, WARN, ERROR). Includes parameter substitution and exception handling.
public interface Logger {
String getName();
// Level checking methods
boolean isTraceEnabled();
boolean isDebugEnabled();
boolean isInfoEnabled();
boolean isWarnEnabled();
boolean isErrorEnabled();
boolean isEnabledForLevel(Level level);
// Basic logging methods
void trace(String msg);
void debug(String msg);
void info(String msg);
void warn(String msg);
void error(String msg);
// Parameterized logging methods
void info(String format, Object arg);
void info(String format, Object arg1, Object arg2);
void info(String format, Object... arguments);
void info(String msg, Throwable t);
// Fluent API entry points
LoggingEventBuilder atTrace();
LoggingEventBuilder atDebug();
LoggingEventBuilder atInfo();
LoggingEventBuilder atWarn();
LoggingEventBuilder atError();
LoggingEventBuilder atLevel(Level level);
// Builder factory method (for SPI implementers)
LoggingEventBuilder makeLoggingEventBuilder(Level level);
}
public final class LoggerFactory {
public static Logger getLogger(String name);
public static Logger getLogger(Class<?> clazz);
public static ILoggerFactory getILoggerFactory();
}Modern chainable logging interface introduced in SLF4J 2.0. Supports structured logging with key-value pairs, lazy evaluation, and builder pattern for complex log statements.
public interface Logger {
LoggingEventBuilder atTrace();
LoggingEventBuilder atDebug();
LoggingEventBuilder atInfo();
LoggingEventBuilder atWarn();
LoggingEventBuilder atError();
LoggingEventBuilder atLevel(Level level);
}
public interface LoggingEventBuilder {
LoggingEventBuilder setCause(Throwable cause);
LoggingEventBuilder addMarker(Marker marker);
LoggingEventBuilder addArgument(Object p);
LoggingEventBuilder addArgument(Supplier<?> objectSupplier);
LoggingEventBuilder addKeyValue(String key, Object value);
LoggingEventBuilder addKeyValue(String key, Supplier<Object> valueSupplier);
LoggingEventBuilder setMessage(String message);
LoggingEventBuilder setMessage(Supplier<String> messageSupplier);
void log();
void log(String message);
void log(String message, Object arg);
void log(String message, Object arg0, Object arg1);
void log(String message, Object... args);
void log(Supplier<String> messageSupplier);
}
public enum Level {
ERROR, WARN, INFO, DEBUG, TRACE;
int toInt();
static Level intToLevel(int levelInt);
}Named objects for enriching and categorizing log statements. Markers can contain references to other markers and are evaluated by underlying logging implementations for filtering and routing.
public interface Marker {
String getName();
void add(Marker reference);
boolean remove(Marker reference);
boolean contains(Marker other);
boolean contains(String name);
boolean hasReferences();
}
public class MarkerFactory {
public static Marker getMarker(String name);
public static Marker getDetachedMarker(String name);
public static IMarkerFactory getIMarkerFactory();
}
// Logger methods with marker support
public interface Logger {
void info(Marker marker, String msg);
void info(Marker marker, String format, Object arg);
void info(Marker marker, String format, Object... arguments);
boolean isInfoEnabled(Marker marker);
}Thread-local contextual information storage for associating diagnostic data with log statements. Supports both key-value maps and stack-based operations.
public class MDC {
// Basic MDC operations
public static void put(String key, String val);
public static String get(String key);
public static void remove(String key);
public static void clear();
// Context map operations
public static Map<String, String> getCopyOfContextMap();
public static void setContextMap(Map<String, String> contextMap);
// Stack operations (SLF4J 2.0)
public static void pushByKey(String key, String value);
public static String popByKey(String key);
public static Deque<String> getCopyOfDequeByKey(String key);
// Auto-cleanup support
public static MDCCloseable putCloseable(String key, String val);
}Pluggable architecture enabling different logging framework implementations. Provides factory interfaces and service provider contracts for extending SLF4J.
public interface SLF4JServiceProvider {
ILoggerFactory getLoggerFactory();
IMarkerFactory getMarkerFactory();
MDCAdapter getMDCAdapter();
String getRequestedApiVersion();
void initialize();
}
public interface ILoggerFactory {
Logger getLogger(String name);
}
public interface IMarkerFactory {
Marker getMarker(String name);
boolean exists(String name);
Marker getDetachedMarker(String name);
}// Logger factory interface
public interface ILoggerFactory {
Logger getLogger(String name);
}
// Marker factory interface
public interface IMarkerFactory {
Marker getMarker(String name);
boolean exists(String name);
Marker getDetachedMarker(String name);
}
// MDC adapter interface
public interface MDCAdapter {
void put(String key, String val);
String get(String key);
void remove(String key);
void clear();
Map<String, String> getCopyOfContextMap();
void setContextMap(Map<String, String> contextMap);
void pushByKey(String key, String value);
String popByKey(String key);
Deque<String> getCopyOfDequeByKey(String key);
}
// Auto-closeable MDC wrapper
public static class MDC.MDCCloseable implements Closeable {
public void close();
}// Logging event interface
public interface LoggingEvent {
Level getLevel();
String getLoggerName();
String getMessage();
List<Object> getArguments();
Object[] getArgumentArray();
List<Marker> getMarkers();
List<KeyValuePair> getKeyValuePairs();
Throwable getThrowable();
long getTimeStamp();
String getThreadName();
String getCallerBoundary();
}
// Key-value pair for structured logging
public class KeyValuePair {
public final String key;
public final Object value;
public KeyValuePair(String key, Object value);
public String toString();
public boolean equals(Object o);
public int hashCode();
}// Logger constants
public interface Logger {
String ROOT_LOGGER_NAME = "ROOT";
}
// Marker constants
public interface Marker {
String ANY_MARKER = "*";
String ANY_NON_NULL_MARKER = "+";
}
// Level integer constants
public class EventConstants {
public static final int ERROR_INT = 40;
public static final int WARN_INT = 30;
public static final int INFO_INT = 20;
public static final int DEBUG_INT = 10;
public static final int TRACE_INT = 0;
}