You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ja...@apache.org on 2016/09/22 12:42:34 UTC
lucene-solr:branch_6x: SOLR-8186: Added robustness to the dynamic log
muting logic
Repository: lucene-solr
Updated Branches:
refs/heads/branch_6x 00035c851 -> 7498ca9ad
SOLR-8186: Added robustness to the dynamic log muting logic
(cherry picked from commit eabb05f)
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/7498ca9a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/7498ca9a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/7498ca9a
Branch: refs/heads/branch_6x
Commit: 7498ca9ad67b25e48e2ae182256864b06d82e186
Parents: 00035c8
Author: Jan H�ydahl <ja...@apache.org>
Authored: Thu Sep 22 13:37:13 2016 +0200
Committer: Jan H�ydahl <ja...@apache.org>
Committed: Thu Sep 22 14:42:25 2016 +0200
----------------------------------------------------------------------
.../apache/solr/servlet/SolrDispatchFilter.java | 19 +----
.../solr/servlet/StartupLoggingUtils.java | 85 ++++++++++++++++++++
2 files changed, 86 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7498ca9a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
index a32a70a..17f9b6e 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
@@ -37,7 +37,6 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Enumeration;
import java.util.Locale;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -49,14 +48,10 @@ import org.apache.commons.io.input.CloseShieldInputStream;
import org.apache.commons.io.output.CloseShieldOutputStream;
import org.apache.commons.lang.StringUtils;
import org.apache.http.client.HttpClient;
-import org.apache.log4j.Appender;
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.LogManager;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.util.ExecutorUtil;
-import org.apache.solr.common.util.SuppressForbidden;
import org.apache.solr.core.CoreContainer;
import org.apache.solr.core.NodeConfig;
import org.apache.solr.core.SolrCore;
@@ -124,7 +119,7 @@ public class SolrDispatchFilter extends BaseSolrFilter {
{
String muteConsole = System.getProperty(SOLR_LOG_MUTECONSOLE);
if (muteConsole != null && !Arrays.asList("false","0","off","no").contains(muteConsole.toLowerCase(Locale.ROOT))) {
- muteConsole();
+ StartupLoggingUtils.muteConsole();
}
log.info("SolrDispatchFilter.init(): {}", this.getClass().getClassLoader());
@@ -161,18 +156,6 @@ public class SolrDispatchFilter extends BaseSolrFilter {
log.info("SolrDispatchFilter.init() done");
}
- @SuppressForbidden(reason = "Legitimate log4j access")
- private void muteConsole() {
- Enumeration appenders = LogManager.getRootLogger().getAllAppenders();
- while (appenders.hasMoreElements()) {
- Appender appender = (Appender) appenders.nextElement();
- if (appender instanceof ConsoleAppender) {
- log.info("Property solr.log.muteconsole given. Muting ConsoleAppender named " + appender.getName());
- LogManager.getRootLogger().removeAppender(appender);
- }
- }
- }
-
/**
* Override this to change CoreContainer initialization
* @return a CoreContainer to hold this server's cores
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7498ca9a/solr/core/src/java/org/apache/solr/servlet/StartupLoggingUtils.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/StartupLoggingUtils.java b/solr/core/src/java/org/apache/solr/servlet/StartupLoggingUtils.java
new file mode 100644
index 0000000..fbcebeb
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/servlet/StartupLoggingUtils.java
@@ -0,0 +1,85 @@
+/*
+ * 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.servlet;
+
+import java.lang.invoke.MethodHandles;
+import java.util.Enumeration;
+
+import org.apache.log4j.Appender;
+import org.apache.log4j.ConsoleAppender;
+import org.apache.log4j.LogManager;
+import org.apache.solr.common.util.SuppressForbidden;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.impl.StaticLoggerBinder;
+
+/**
+ * Handles dynamic modification of during startup, before CoreContainer is created
+ * <p>
+ * WARNING: This class should only be used during startup. For modifying log levels etc
+ * during runtime, SLF4J and LogWatcher must be used.
+ * </p>
+ */
+final class StartupLoggingUtils {
+ private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+ private final static StaticLoggerBinder binder = StaticLoggerBinder.getSingleton();
+
+ /**
+ * Disables all log4j ConsoleAppender's by modifying log4j configuration dynamically.
+ * Must only be used during early startup
+ * @return true if ok or else false if something happened, e.g. log4j classes were not in classpath
+ */
+ @SuppressForbidden(reason = "Legitimate log4j access")
+ static boolean muteConsole() {
+ try {
+ if (!isLog4jActive()) {
+ logNotSupported("Could not mute logging to console.");
+ return false;
+ }
+ org.apache.log4j.Logger rootLogger = LogManager.getRootLogger();
+ Enumeration appenders = rootLogger.getAllAppenders();
+ while (appenders.hasMoreElements()) {
+ Appender appender = (Appender) appenders.nextElement();
+ if (appender instanceof ConsoleAppender) {
+ log.info("Property solr.log.muteconsole given. Muting ConsoleAppender named " + appender.getName());
+ rootLogger.removeAppender(appender);
+ }
+ }
+ return true;
+ } catch (Exception e) {
+ logNotSupported("Could not mute logging to console.");
+ return false;
+ }
+ }
+
+ private static boolean isLog4jActive() {
+ try {
+ // Make sure we have log4j LogManager in classpath
+ Class.forName("org.apache.log4j.LogManager");
+ // Make sure that log4j is really selected as logger in slf4j - we could have LogManager in the bridge class :)
+ return binder.getLoggerFactoryClassStr().contains("Log4jLoggerFactory");
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ private static void logNotSupported(String msg) {
+ log.warn("{} Dynamic log manipulation currently only supported for Log4j. "
+ + "Please consult your logging framework of choice on how to configure the appropriate logging.", msg);
+ }
+}