Comprehensive logging framework module for Dropwizard applications providing configurable appenders, formatters, and logback integration
npx @tessl/cli install tessl/maven-io-dropwizard--dropwizard-logging@4.0.0A comprehensive logging framework module for Dropwizard applications providing configurable appenders, formatters, and Logback integration. Built on top of Logback and SLF4J, it offers a wide range of configurable appenders including console, file, syslog, and network socket appenders (TCP/UDP), along with advanced features like async logging, custom layouts, filters, and structured JSON logging.
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-logging</artifactId>
<version>4.0.14</version>
</dependency>import io.dropwizard.logging.common.*;
import io.dropwizard.logging.common.filter.*;
import io.dropwizard.logging.common.layout.*;
import io.dropwizard.logging.common.async.*;import io.dropwizard.logging.common.DefaultLoggingFactory;
import io.dropwizard.logging.common.ConsoleAppenderFactory;
import io.dropwizard.logging.common.FileAppenderFactory;
import io.dropwizard.logging.common.BootstrapLogging;
import ch.qos.logback.classic.Level;
// Bootstrap logging during application startup
BootstrapLogging.bootstrap();
// Configure logging programmatically
DefaultLoggingFactory loggingFactory = new DefaultLoggingFactory();
loggingFactory.setLevel("INFO");
// Add console appender
ConsoleAppenderFactory<ILoggingEvent> consoleAppender = new ConsoleAppenderFactory<>();
consoleAppender.setTarget(ConsoleAppenderFactory.ConsoleStream.STDOUT);
consoleAppender.setLogFormat("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
// Add file appender
FileAppenderFactory<ILoggingEvent> fileAppender = new FileAppenderFactory<>();
fileAppender.setCurrentLogFilename("./logs/application.log");
fileAppender.setArchivedLogFilenamePattern("./logs/application-%d{yyyy-MM-dd}-%i.log.gz");
fileAppender.setMaxFileSize(DataSize.megabytes(10));
// Add appenders to logging factory
loggingFactory.setAppenders(Arrays.asList(consoleAppender, fileAppender));
// Configure the logging system
MetricRegistry metrics = new MetricRegistry();
loggingFactory.configure(metrics, "MyApplication");Dropwizard Logging follows a factory-based design pattern with several key components:
This design provides seamless integration with Dropwizard's YAML configuration system, allowing complex logging setups to be defined declaratively while maintaining full programmatic control when needed.
Core logging system configuration and lifecycle management providing the main entry points for setting up logging in Dropwizard applications.
public interface LoggingFactory extends Discoverable {
void configure(MetricRegistry metricRegistry, String name);
void stop();
void reset();
}
public class DefaultLoggingFactory implements LoggingFactory {
public void setLevel(String level);
public void setLoggers(Map<String, JsonNode> loggers);
public void setAppenders(List<AppenderFactory<ILoggingEvent>> appenders);
public static Level toLevel(String text);
}
public class ExternalLoggingFactory implements LoggingFactory {
// No-op implementation for external logging configuration
}Comprehensive set of appender implementations for different output destinations including console, files, syslog, and network sockets with extensive configuration options.
public interface AppenderFactory<E> extends Discoverable {
Appender<E> build(LoggerContext context, String applicationName,
LayoutFactory<E> layoutFactory,
LevelFilterFactory<E> levelFilterFactory,
AsyncAppenderFactory<E> asyncAppenderFactory);
}
public abstract class AbstractAppenderFactory<E> implements AppenderFactory<E> {
public void setThreshold(Level threshold);
public void setLogFormat(String logFormat);
public void setLayout(DiscoverableLayoutFactory<E> layout);
public void setTimeZone(TimeZone timeZone);
public void setQueueSize(int queueSize);
public void setMessageRate(Duration messageRate);
// ... additional configuration methods
}Flexible layout system for customizing log message formatting with timezone support and custom pattern converters.
public interface LayoutFactory<E extends DeferredProcessingAware> {
PatternLayoutBase<E> build(LoggerContext context, TimeZone timeZone);
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
public interface DiscoverableLayoutFactory<E extends DeferredProcessingAware> extends Discoverable {
LayoutBase<E> build(LoggerContext context, TimeZone timeZone);
}
public class DropwizardLayout extends PatternLayout {
// Default Dropwizard layout with custom converters
}
public class DropwizardLayoutFactory implements LayoutFactory<ILoggingEvent> {
public PatternLayoutBase<ILoggingEvent> build(LoggerContext context, TimeZone timeZone);
}Configurable filter system for controlling which log events are processed by appenders with threshold and custom filtering capabilities.
public interface FilterFactory<E> extends Discoverable {
Filter<E> build();
}
public interface LevelFilterFactory<E> {
Filter<E> build(Level threshold);
}
public class ThresholdLevelFilterFactory implements LevelFilterFactory<ILoggingEvent> {
public Filter<ILoggingEvent> build(Level threshold);
}
public class NullLevelFilterFactory<E> implements LevelFilterFactory<E> {
public Filter<E> build(Level threshold);
}Asynchronous logging capabilities for high-throughput applications with configurable queue sizes and discard policies.
public interface AsyncAppenderFactory<E> {
AsyncAppenderBase<E> build();
}
public class AsyncLoggingEventAppenderFactory implements AsyncAppenderFactory<ILoggingEvent> {
public AsyncAppenderBase<ILoggingEvent> build();
}Essential utility classes for logging system management including bootstrap configuration and JDK logging integration.
public class BootstrapLogging {
public static void bootstrap();
public static void bootstrap(Level level);
public static void bootstrap(Level level, DiscoverableLayoutFactory<ILoggingEvent> layoutFactory);
}
public class LoggingUtil {
public static LoggerContext getLoggerContext();
public static void hijackJDKLogging();
}public class LoggerConfiguration {
private String level = "INFO";
private List<AppenderFactory<ILoggingEvent>> appenders;
private boolean additive = true;
public String getLevel();
public void setLevel(String level);
public List<AppenderFactory<ILoggingEvent>> getAppenders();
public void setAppenders(List<AppenderFactory<ILoggingEvent>> appenders);
public boolean isAdditive();
public void setAdditive(boolean additive);
}public enum ConsoleStream {
STDOUT, STDERR
}
public enum Facility {
KERN, USER, MAIL, DAEMON, AUTH, SYSLOG, LPR, NEWS, UUCP, CRON,
AUTHPRIV, FTP, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7
}