You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2021/12/16 15:32:27 UTC

[tika] 01/03: TIKA-3618 -- migrate to log4j2 cleanup...we don't need our own log4j2 wrapper

This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch branch_1x
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 371338987584b988d5bbccc1f6bf0c014d384635
Author: tallison <ta...@apache.org>
AuthorDate: Thu Dec 16 10:13:28 2021 -0500

    TIKA-3618 -- migrate to log4j2 cleanup...we don't need our own log4j2 wrapper
---
 .../apache/tika/server/metrics/Log4j2Metrics.java  | 257 ---------------------
 .../apache/tika/server/metrics/MetricsHelper.java  |   1 +
 2 files changed, 1 insertion(+), 257 deletions(-)

diff --git a/tika-server/src/main/java/org/apache/tika/server/metrics/Log4j2Metrics.java b/tika-server/src/main/java/org/apache/tika/server/metrics/Log4j2Metrics.java
deleted file mode 100644
index 0950c2a..0000000
--- a/tika-server/src/main/java/org/apache/tika/server/metrics/Log4j2Metrics.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tika.server.metrics;
-
-import io.micrometer.core.instrument.Counter;
-import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tag;
-import io.micrometer.core.instrument.binder.BaseUnits;
-import io.micrometer.core.instrument.binder.MeterBinder;
-import io.micrometer.core.lang.NonNullApi;
-import io.micrometer.core.lang.NonNullFields;
-import org.apache.commons.collections4.EnumerationUtils;
-import org.apache.cxf.helpers.CastUtils;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.Appender;
-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.appender.AsyncAppender;
-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;
-import org.apache.logging.log4j.core.filter.CompositeFilter;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.stream.Stream;
-
-/**
- * Log4J metrics meter binder.
- * Largely inspired by: https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/Log4j2Metrics.java
- */
-public class Log4j2Metrics implements MeterBinder, AutoCloseable {
-
-    /**
-     * Te meter name.
-     */
-    private static final String METER_NAME = "log4j2.events";
-
-    /**
-     * Additional tags.
-     */
-    private final Iterable<Tag> tags;
-
-    /**
-     * List of metrics filters
-     */
-    private final List<MetricsFilter> metricsFilters = new ArrayList<>();
-
-    private final LoggerContext loggerContext;
-
-    /**
-     * Initializes metrics with no additional tags.
-     */
-    public Log4j2Metrics() {
-        this(Collections.emptyList());
-    }
-
-    /**
-     * Initializes metrics with additional tags.
-     * @param tags the additional tags.
-     */
-    public Log4j2Metrics(Iterable<Tag> tags) {
-        this(tags, (LoggerContext) LogManager.getContext(false));
-    }
-
-    public Log4j2Metrics(Iterable<Tag> tags, LoggerContext loggerContext) {
-        this.tags = tags;
-        this.loggerContext = loggerContext;
-    }
-    /**
-     * Binds the metrics to registry.
-     * @param meterRegistry the meter registry to bind to.
-     */
-    @Override
-    public void bindTo(@NotNull MeterRegistry meterRegistry) {
-        Configuration configuration = loggerContext.getConfiguration();
-        LoggerConfig rootLoggerConfig = configuration.getRootLogger();
-        rootLoggerConfig.addFilter(createMetricsFilterAndStart(meterRegistry, rootLoggerConfig));
-
-        loggerContext.getConfiguration().getLoggers().values().stream()
-                .filter(loggerConfig -> !loggerConfig.isAdditive())
-                .forEach(loggerConfig -> {
-                    if (loggerConfig == rootLoggerConfig) {
-                        return;
-                    }
-                    Filter logFilter = loggerConfig.getFilter();
-
-                    if ((logFilter instanceof CompositeFilter && Arrays.stream(((CompositeFilter) logFilter).getFiltersArray())
-                            .anyMatch(innerFilter -> innerFilter instanceof MetricsFilter))) {
-                        return;
-                    }
-
-                    if (logFilter instanceof MetricsFilter) {
-                        return;
-                    }
-                    loggerConfig.addFilter(createMetricsFilterAndStart(meterRegistry, loggerConfig));
-                });
-
-        loggerContext.updateLoggers(configuration);
-    }
-
-
-    private MetricsFilter createMetricsFilterAndStart(MeterRegistry registry, LoggerConfig loggerConfig) {
-        MetricsFilter metricsFilter = new MetricsFilter(registry, tags, loggerConfig);
-        metricsFilter.start();
-        metricsFilters.add(metricsFilter);
-        return metricsFilter;
-    }
-
-
-    /**
-     * Clears all metrics filters.
-     * @throws Exception if an issue.
-     */
-    @Override
-    public void close() throws Exception {
-        if (!metricsFilters.isEmpty()) {
-            Configuration configuration = loggerContext.getConfiguration();
-            LoggerConfig rootLoggerConfig = configuration.getRootLogger();
-            metricsFilters.forEach(rootLoggerConfig::removeFilter);
-
-            loggerContext.getConfiguration().getLoggers().values().stream()
-                    .filter(loggerConfig -> !loggerConfig.isAdditive())
-                    .forEach(loggerConfig -> {
-                        if (loggerConfig != rootLoggerConfig) {
-                            metricsFilters.forEach(loggerConfig::removeFilter);
-                        }
-                    });
-
-            loggerContext.updateLoggers(configuration);
-            metricsFilters.forEach(MetricsFilter::stop);
-        }
-    }
-
-
-    /**
-     * Monitors all logging through log4j2 and keeps count of
-     * all logs for all levels.
-     */
-    @NonNullApi
-    @NonNullFields
-    private class MetricsFilter extends AbstractFilter {
-
-        /**
-         * Map of log level string to counter.
-         */
-        private final Map<String, Counter> LEVEL_COUNTER_MAP =
-                new HashMap<>();
-
-        private final boolean isAsyncLogger;
-
-        //this is a list of non-MetricsFilters associated with the loggerConfig
-        //these are used to determine whether or not to filter this through
-        //MetricsFilter
-        private final List<Filter> filters;
-
-        /**
-         * Initializes metrics filter with registry and tags.
-         * @param registry the meter registry to bind to.
-         * @param tags the additional tags.
-         */
-        MetricsFilter(MeterRegistry registry, Iterable<Tag> tags, LoggerConfig loggerConfig) {
-            this.isAsyncLogger = (loggerConfig instanceof AsyncLoggerConfig);
-            this.filters = getNonMetricsFilterFilters(loggerConfig);
-            Stream.of("fatal", "error", "warn", "info", "debug", "trace")
-                    .forEach(levelStr -> LEVEL_COUNTER_MAP.put(levelStr,
-                            Counter.builder(METER_NAME)
-                            .tags(tags)
-                            .tags("level", levelStr)
-                            .description("Number of " + levelStr + " level log events")
-                            .baseUnit(BaseUnits.EVENTS)
-                            .register(registry)));
-        }
-
-        private List<Filter> getNonMetricsFilterFilters(LoggerConfig loggerConfig) {
-            List<Filter> filters = new ArrayList<>();
-            Filter filter = loggerConfig.getFilter();
-            addFilters(filter, filters);
-            return filters;
-        }
-
-        private void addFilters(Filter filter, List<Filter> filters) {
-            if (filter == null) {
-                return;
-            }
-            if (filter instanceof CompositeFilter) {
-                for (Filter f : ((CompositeFilter)filter).getFiltersArray()) {
-                    addFilters(f, filters);
-                }
-                return;
-            }
-            if (filter instanceof MetricsFilter) {
-                return;
-            }
-            filters.add(filter);
-        }
-
-        /**
-         * Internally calls the filter chain, and increments based on final decision.
-         * @param event the logging event.
-         * @return the final decision.
-         */
-        @Override
-        public Result filter(LogEvent event) {
-            Result result = Result.NEUTRAL;
-            for (Filter filter : filters) {
-                result = filter.filter(event);
-                if (result != Result.NEUTRAL) break;
-            }
-            if (result != Result.DENY) {
-                if (!isAsyncLogger || isAsyncLoggerAndEndOfBatch(event)) {
-                    incrementCounter(event);
-                }
-            }
-            return result;
-        }
-
-        private boolean isAsyncLoggerAndEndOfBatch(LogEvent event) {
-            return isAsyncLogger && event.isEndOfBatch();
-        }
-
-        /**
-         * Increments the appropriate counter.
-         * @param event the logging event.
-         */
-        private void incrementCounter(LogEvent event) {
-            LEVEL_COUNTER_MAP.get(event.getLevel().toString().toLowerCase(Locale.ROOT))
-                    .increment();
-        }
-    }
-
-}
diff --git a/tika-server/src/main/java/org/apache/tika/server/metrics/MetricsHelper.java b/tika-server/src/main/java/org/apache/tika/server/metrics/MetricsHelper.java
index 80f42ce..fc635ca 100644
--- a/tika-server/src/main/java/org/apache/tika/server/metrics/MetricsHelper.java
+++ b/tika-server/src/main/java/org/apache/tika/server/metrics/MetricsHelper.java
@@ -27,6 +27,7 @@ import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics;
 import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;
 import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
 import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
+import io.micrometer.core.instrument.binder.logging.Log4j2Metrics;
 import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics;
 import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
 import io.micrometer.core.instrument.binder.system.UptimeMetrics;