From 9cadbf04b6556b227580a7d72f7af51fcf3083f3 Mon Sep 17 00:00:00 2001 From: David Smiley Date: Thu, 1 Oct 2020 08:31:39 -0400 Subject: [PATCH] SOLR-12987: Deprecated plugins are logged once and with log category org.apache.solr.DEPRECATED (#1927) --- solr/CHANGES.txt | 3 ++ .../apache/solr/core/SolrResourceLoader.java | 5 +- .../apache/solr/logging/DeprecationLog.java | 50 +++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 solr/core/src/java/org/apache/solr/logging/DeprecationLog.java diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 24952d89a7b..32be5fcba51 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -291,6 +291,9 @@ Other Changes Also, Deprecate unused constants NULL_COLLAPSE, NULL_IGNORE, NULL_EXPAND, HINT_MULTI_DOCVALUES in collapse parser. (Guna Sekhar Dora Kovvuru, Munendra S N, Mike Drob) +* SOLR-12987: Deprecated plugins/features are now logged once and with log category org.apache.solr.DEPRECATED + (David Smiley) + ================== 8.6.2 ================== Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release. diff --git a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java index dbfb0d56485..69eabc5631c 100644 --- a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java +++ b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java @@ -62,6 +62,7 @@ import org.apache.solr.common.SolrException; import org.apache.solr.common.cloud.SolrClassLoader; import org.apache.solr.handler.component.SearchComponent; import org.apache.solr.handler.component.ShardHandlerFactory; +import org.apache.solr.logging.DeprecationLog; import org.apache.solr.pkg.PackageListeningClassLoader; import org.apache.solr.request.SolrRequestHandler; import org.apache.solr.response.QueryResponseWriter; @@ -529,8 +530,8 @@ public class SolrResourceLoader implements ResourceLoader, Closeable, SolrClassL // print warning if class is deprecated if (clazz.isAnnotationPresent(Deprecated.class)) { - log.warn("Solr loaded a deprecated plugin/analysis class [{}]. Please consult documentation how to replace it accordingly.", - cname); + DeprecationLog.log(cname, + "Solr loaded a deprecated plugin/analysis class [" + cname + "]. Please consult documentation how to replace it accordingly."); } } } diff --git a/solr/core/src/java/org/apache/solr/logging/DeprecationLog.java b/solr/core/src/java/org/apache/solr/logging/DeprecationLog.java new file mode 100644 index 00000000000..20c775e2672 --- /dev/null +++ b/solr/core/src/java/org/apache/solr/logging/DeprecationLog.java @@ -0,0 +1,50 @@ +/* + * 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.solr.logging; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Utility to log a deprecation. + */ +public class DeprecationLog { + + public static final String LOG_PREFIX = "org.apache.solr.DEPRECATED."; + + // featureId -> message. Don't really need the message + private static final Map alreadyLogged = new ConcurrentHashMap<>(); + + /** + * Logs a deprecation warning for the provided feature, but only the first time. + * The logger name used is {@value LOG_PREFIX} + {@code featureId}. + * Remember that logger names are disable-able via configuration if needed. + * @return true if logged + */ + public static boolean log(String featureId, String message) { + if (alreadyLogged.putIfAbsent(featureId, message) != null) { + return false; + } + Logger log = LoggerFactory.getLogger(LOG_PREFIX + featureId); + log.warn(message); + return true; + } +}