Comprehensive SLF4J implementation providing enterprise-grade logging with flexible configuration, high performance, and extensive appender ecosystem for Java applications.
—
Programmatic and XML-based configuration for loggers, appenders, and overall system behavior. Logback provides flexible configuration through multiple mechanisms including XML files, Groovy scripts, and programmatic APIs.
Simple programmatic configuration utilities for quick setup.
/**
* Utility class for basic programmatic configuration
*/
public class BasicConfigurator {
/**
* Configure the logger context with a basic console appender
* @param lc the logger context to configure
*/
public static void configure(LoggerContext lc);
/**
* Configure with custom appender
* @param lc the logger context
* @param appender the appender to add to root logger
*/
public static void configureDefaultContext();
}Usage Examples:
import ch.qos.logback.classic.BasicConfigurator;
import ch.qos.logback.classic.LoggerContext;
import org.slf4j.LoggerFactory;
// Basic console configuration
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
BasicConfigurator.configure(context);
// Alternative for default context
BasicConfigurator.configureDefaultContext();Service Provider Interface for custom configuration implementations.
/**
* SPI for programmatic configuration of Logback
*/
public interface Configurator extends ContextAware {
/**
* Execution status for configurator chain
*/
enum ExecutionStatus {
NEUTRAL, // Let caller decide
INVOKE_NEXT_IF_ANY, // Continue to next configurator
DO_NOT_INVOKE_NEXT_IF_ANY // Stop configurator chain
}
/**
* Configure the logger context
* @param loggerContext the context to configure
* @return execution status indicating whether to continue chain
*/
ExecutionStatus configure(LoggerContext loggerContext);
}
/**
* Annotation for configurator ranking
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfiguratorRank {
int value() default 0;
}Usage Examples:
import ch.qos.logback.classic.spi.Configurator;
import ch.qos.logback.classic.LoggerContext;
@ConfiguratorRank(100)
public class CustomConfigurator implements Configurator {
@Override
public ExecutionStatus configure(LoggerContext loggerContext) {
// Custom configuration logic
Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
ConsoleAppender<ILoggingEvent> appender = new ConsoleAppender<>();
appender.setContext(loggerContext);
appender.setName("console");
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
appender.setEncoder(encoder);
appender.start();
rootLogger.addAppender(appender);
rootLogger.setLevel(Level.INFO);
return ExecutionStatus.INVOKE_NEXT_IF_ANY;
}
@Override
public void setContext(Context context) {
// Implementation
}
@Override
public Context getContext() {
return null; // Implementation
}
}Advanced context configuration and management capabilities.
/**
* Context selector for choosing logger contexts in different environments
*/
public interface ContextSelector {
LoggerContext getLoggerContext();
LoggerContext getLoggerContext(String name);
LoggerContext getDefaultLoggerContext();
LoggerContext detachLoggerContext(String loggerContextName);
List<String> getContextNames();
}
/**
* Default context selector implementation
*/
public class DefaultContextSelector implements ContextSelector {
private LoggerContext defaultLoggerContext;
public LoggerContext getLoggerContext();
public LoggerContext getLoggerContext(String name);
public LoggerContext getDefaultLoggerContext();
public LoggerContext detachLoggerContext(String loggerContextName);
public List<String> getContextNames();
}
/**
* JNDI-based context selector for enterprise environments
*/
public class ContextJNDISelector implements ContextSelector {
// JNDI-based context selection logic
}Joran framework components for XML-based configuration processing.
/**
* Main configuration interpreter for XML files
*/
public class JoranConfigurator extends GenericConfigurator {
/**
* Configure from XML file
* @param file the configuration file
*/
public void doConfigure(File file) throws JoranException;
/**
* Configure from URL
* @param url the configuration URL
*/
public void doConfigure(URL url) throws JoranException;
/**
* Configure from input stream
* @param inputStream the configuration stream
*/
public void doConfigure(InputStream inputStream) throws JoranException;
}
/**
* Context initializer handling automatic configuration
*/
public class ContextInitializer {
public static final String AUTOCONFIG_FILE = "logback.xml";
public static final String TEST_AUTOCONFIG_FILE = "logback-test.xml";
public static final String CONFIG_FILE_PROPERTY = "logback.configurationFile";
public void autoConfig() throws JoranException;
public void configureByResource(URL url) throws JoranException;
public URL findURLOfDefaultConfigurationFile(boolean updateStatus);
}Usage Examples:
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.classic.util.ContextInitializer;
import ch.qos.logback.core.joran.spi.JoranException;
// Manual XML configuration
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(context);
try {
context.reset();
configurator.doConfigure(new File("logback-config.xml"));
} catch (JoranException e) {
// Handle configuration error
}
// Automatic configuration
ContextInitializer ci = new ContextInitializer(context);
try {
ci.autoConfig();
} catch (JoranException e) {
// Handle configuration error
}Configuration model objects for programmatic configuration building.
/**
* Configuration model for loggers
*/
public class LoggerModel extends ComponentModel {
String name;
String level;
Boolean additivity;
public String getName();
public void setName(String name);
public String getLevel();
public void setLevel(String level);
public Boolean getAdditivity();
public void setAdditivity(Boolean additivity);
}
/**
* Configuration model for appenders
*/
public class AppenderModel extends ComponentModel {
String name;
String className;
public String getName();
public void setName(String name);
public String getClassName();
public void setClassName(String className);
}
/**
* Root configuration model
*/
public class ConfigurationModel extends Model {
Boolean debug;
Duration scanPeriod;
Boolean packagingData;
public Boolean getDebug();
public void setDebug(Boolean debug);
public Duration getScanPeriod();
public void setScanPeriod(Duration scanPeriod);
public Boolean getPackagingData();
public void setPackagingData(Boolean packagingData);
}Configuration utility classes and helpers.
/**
* Utilities for logger name operations
*/
public class LoggerNameUtil {
public static int getFirstSeparatorIndexOf(String name);
public static boolean startsWithSeparator(String name);
public static boolean endsWithSeparator(String name);
public static String getPackageName(String loggerName);
}
/**
* Context initialization utilities
*/
public class ContextInitializer {
public static final String AUTOCONFIG_FILE = "logback.xml";
public static final String TEST_AUTOCONFIG_FILE = "logback-test.xml";
public ContextInitializer(LoggerContext loggerContext);
public void autoConfig() throws JoranException;
public void configureByResource(URL url) throws JoranException;
public URL findURLOfDefaultConfigurationFile(boolean updateStatus);
public void multiplicityWarning(String resourceName, ClassLoader classLoader);
}import ch.qos.logback.classic.*;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.ConsoleAppender;
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
// Create console appender
ConsoleAppender<ILoggingEvent> appender = new ConsoleAppender<>();
appender.setContext(context);
appender.setName("console");
// Create encoder
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(context);
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
appender.setEncoder(encoder);
appender.start();
// Configure root logger
Logger rootLogger = context.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(appender);
rootLogger.setLevel(Level.INFO);
// Configure specific logger
Logger logger = context.getLogger("com.example.app");
logger.setLevel(Level.DEBUG);
logger.setAdditive(false); // Don't inherit appenders from parentThe XML configuration uses a hierarchical structure with the following key elements:
<configuration> - Root element<appender> - Output destination configuration<encoder> or <layout> - Message formatting<logger> - Logger-specific configuration<root> - Root logger configuration<filter> - Event filtering rulesConfiguration files are automatically discovered in this order:
logback-test.xml (if in test classpath)logback.xml (if in classpath)ServiceLoaderBasicConfigurator as fallbackInstall with Tessl CLI
npx tessl i tessl/maven-ch-qos-logback--logback-classic