diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/Log4j2Metrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/Log4j2Metrics.java index a4904d0631..e7b7d73b12 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/Log4j2Metrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/Log4j2Metrics.java @@ -26,7 +26,6 @@ import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.async.AsyncLoggerConfig; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.filter.AbstractFilter; @@ -39,7 +38,12 @@ import static java.util.Collections.emptyList; /** - * {@link MeterBinder} for Apache Log4j 2. + * {@link MeterBinder} for Apache Log4j 2. Please use at least 2.21.0 since there was a + * bug in earlier versions that prevented Micrometer to increment its counters correctly. + * See: + * logging-log4j2#1550 + * See: micrometer#2176 * * @author Steven Sheehy * @author Johnny Lim @@ -55,7 +59,7 @@ public class Log4j2Metrics implements MeterBinder, AutoCloseable { private final LoggerContext loggerContext; - private List metricsFilters = new ArrayList<>(); + private final List metricsFilters = new ArrayList<>(); public Log4j2Metrics() { this(emptyList()); @@ -75,7 +79,7 @@ public void bindTo(MeterRegistry registry) { Configuration configuration = loggerContext.getConfiguration(); LoggerConfig rootLoggerConfig = configuration.getRootLogger(); - rootLoggerConfig.addFilter(createMetricsFilterAndStart(registry, rootLoggerConfig)); + rootLoggerConfig.addFilter(createMetricsFilterAndStart(registry)); loggerContext.getConfiguration() .getLoggers() @@ -97,14 +101,14 @@ public void bindTo(MeterRegistry registry) { if (logFilter instanceof MetricsFilter) { return; } - loggerConfig.addFilter(createMetricsFilterAndStart(registry, loggerConfig)); + loggerConfig.addFilter(createMetricsFilterAndStart(registry)); }); loggerContext.updateLoggers(configuration); } - private MetricsFilter createMetricsFilterAndStart(MeterRegistry registry, LoggerConfig loggerConfig) { - MetricsFilter metricsFilter = new MetricsFilter(registry, tags, loggerConfig instanceof AsyncLoggerConfig); + private MetricsFilter createMetricsFilterAndStart(MeterRegistry registry) { + MetricsFilter metricsFilter = new MetricsFilter(registry, tags); metricsFilter.start(); metricsFilters.add(metricsFilter); return metricsFilter; @@ -135,7 +139,7 @@ public void close() { @NonNullApi @NonNullFields - class MetricsFilter extends AbstractFilter { + static class MetricsFilter extends AbstractFilter { private final Counter fatalCounter; @@ -149,10 +153,7 @@ class MetricsFilter extends AbstractFilter { private final Counter traceCounter; - private final boolean isAsyncLogger; - - MetricsFilter(MeterRegistry registry, Iterable tags, boolean isAsyncLogger) { - this.isAsyncLogger = isAsyncLogger; + MetricsFilter(MeterRegistry registry, Iterable tags) { fatalCounter = Counter.builder(METER_NAME) .tags(tags) .tags("level", "fatal") @@ -198,18 +199,10 @@ class MetricsFilter extends AbstractFilter { @Override public Result filter(LogEvent event) { - - if (!isAsyncLogger || isAsyncLoggerAndEndOfBatch(event)) { - incrementCounter(event); - } - + incrementCounter(event); return Result.NEUTRAL; } - private boolean isAsyncLoggerAndEndOfBatch(LogEvent event) { - return isAsyncLogger && event.isEndOfBatch(); - } - private void incrementCounter(LogEvent event) { switch (event.getLevel().getStandardLevel()) { case FATAL: diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/logging/Log4j2MetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/logging/Log4j2MetricsTest.java index 81f8008dc7..3036274017 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/logging/Log4j2MetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/logging/Log4j2MetricsTest.java @@ -174,8 +174,10 @@ void asyncLogShouldNotBeDuplicated() throws IOException { assertThat(registry.get("log4j2.events").tags("level", "info").counter().count()).isEqualTo(0); logger.info("Hello, world!"); + logger.info("Hello, world!"); + logger.info("Hello, world!"); await().atMost(Duration.ofSeconds(1)) - .until(() -> registry.get("log4j2.events").tags("level", "info").counter().count() == 1); + .until(() -> registry.get("log4j2.events").tags("level", "info").counter().count() == 3); } }