package io.dropwizard.request.logging; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; import com.google.common.collect.ImmutableList; import io.dropwizard.logging.AppenderFactory; import io.dropwizard.logging.ConsoleAppenderFactory; import io.dropwizard.logging.async.AsyncAppenderFactory; import io.dropwizard.logging.filter.LevelFilterFactory; import io.dropwizard.logging.filter.NullLevelFilterFactory; import io.dropwizard.logging.layout.LayoutFactory; import io.dropwizard.request.logging.async.AsyncAccessEventAppenderFactory; import io.dropwizard.request.logging.layout.LogbackAccessRequestLayoutFactory; import org.eclipse.jetty.server.RequestLog; import org.slf4j.LoggerFactory; import javax.validation.Valid; import javax.validation.constraints.NotNull; /** * A factory for creating {@link LogbackAccessRequestLog} instances. * <p/> * <b>Configuration Parameters:</b> * <table> * <tr> * <td>Name</td> * <td>Default</td> * <td>Description</td> * </tr> * <tr> * <td>{@code appenders}</td> * <td>a default {@link ConsoleAppenderFactory console} appender</td> * <td>The set of {@link AppenderFactory appenders} to which requests will be logged.</td> * </tr> * </table> */ @JsonTypeName("logback-access") public class LogbackAccessRequestLogFactory implements RequestLogFactory { @Valid @NotNull private ImmutableList<AppenderFactory<IAccessEvent>> appenders = ImmutableList .of(new ConsoleAppenderFactory<>()); @JsonProperty public ImmutableList<AppenderFactory<IAccessEvent>> getAppenders() { return appenders; } @JsonProperty public void setAppenders(ImmutableList<AppenderFactory<IAccessEvent>> appenders) { this.appenders = appenders; } @JsonIgnore @Override public boolean isEnabled() { return !appenders.isEmpty(); } @Override public RequestLog build(String name) { final Logger logger = (Logger) LoggerFactory.getLogger("http.request"); logger.setAdditive(false); final LoggerContext context = logger.getLoggerContext(); final LogbackAccessRequestLog requestLog = new LogbackAccessRequestLog(); final LevelFilterFactory<IAccessEvent> levelFilterFactory = new NullLevelFilterFactory<>(); final AsyncAppenderFactory<IAccessEvent> asyncAppenderFactory = new AsyncAccessEventAppenderFactory(); final LayoutFactory<IAccessEvent> layoutFactory = new LogbackAccessRequestLayoutFactory(); for (AppenderFactory<IAccessEvent> output : appenders) { requestLog.addAppender(output.build(context, name, layoutFactory, levelFilterFactory, asyncAppenderFactory)); } return requestLog; } }