package io.dropwizard.metrics; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.ScheduledReporter; import com.codahale.metrics.Slf4jReporter; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; import org.hibernate.validator.constraints.NotEmpty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MarkerFactory; /** * A {@link ReporterFactory} for {@link Slf4jReporter} instances. * <p/> * <b>Configuration Parameters:</b> * <table> * <tr> * <td>Name</td> * <td>Default</td> * <td>Description</td> * </tr> * <tr> * <td>logger</td> * <td>metrics</td> * <td>The name of the logger to write metrics to.</td> * </tr> * <tr> * <td>markerName</td> * <td>(none)</td> * <td>The name of the marker to mark logged metrics with.</td> * </tr> * <tr> * <td colspan="3">See {@link BaseReporterFactory} for more options.</td> * </tr> * </table> */ @JsonTypeName("log") public class Slf4jReporterFactory extends BaseReporterFactory { @NotEmpty private String loggerName = "metrics"; private String markerName; @JsonProperty("logger") public String getLoggerName() { return loggerName; } @JsonProperty("logger") public void setLoggerName(String loggerName) { this.loggerName = loggerName; } public Logger getLogger() { return LoggerFactory.getLogger(getLoggerName()); } @JsonProperty public String getMarkerName() { return markerName; } @JsonProperty public void setMarkerName(String markerName) { this.markerName = markerName; } @Override public ScheduledReporter build(MetricRegistry registry) { final Slf4jReporter.Builder builder = Slf4jReporter.forRegistry(registry) .convertDurationsTo(getDurationUnit()) .convertRatesTo(getRateUnit()) .filter(getFilter()) .outputTo(getLogger()); if (markerName != null) { builder.markWith(MarkerFactory.getMarker(markerName)); } return builder.build(); } }