You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/04/11 12:35:50 UTC

[17/17] ignite git commit: IGNITE-4863: Disallow change RootLogger log-level if it can have negative effect on other loggers. This closes #1687.

IGNITE-4863: Disallow change RootLogger log-level if it can have negative effect on other loggers. This closes #1687.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/01ceeb13
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/01ceeb13
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/01ceeb13

Branch: refs/heads/ignite-4932
Commit: 01ceeb13420b68edf12b0262fe0991e84c085dd8
Parents: bb3ff12
Author: Andrey V. Mashenkov <an...@gmail.com>
Authored: Thu Apr 6 14:43:50 2017 +0300
Committer: Andrey V. Mashenkov <an...@gmail.com>
Committed: Mon Apr 10 17:12:12 2017 +0300

----------------------------------------------------------------------
 .../apache/ignite/logger/log4j/Log4JLogger.java |  64 +++++-
 .../log4j/GridLog4jInitializationTest.java      | 212 +++++++++++++++++++
 .../logger/log4j/GridLog4jInitializedTest.java  |  55 -----
 .../log4j/GridLog4jNotInitializedTest.java      |  46 ----
 .../ignite/testsuites/IgniteLog4jTestSuite.java |   6 +-
 5 files changed, 268 insertions(+), 115 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/01ceeb13/modules/log4j/src/main/java/org/apache/ignite/logger/log4j/Log4JLogger.java
----------------------------------------------------------------------
diff --git a/modules/log4j/src/main/java/org/apache/ignite/logger/log4j/Log4JLogger.java b/modules/log4j/src/main/java/org/apache/ignite/logger/log4j/Log4JLogger.java
index d5b0f02..f6ed830 100644
--- a/modules/log4j/src/main/java/org/apache/ignite/logger/log4j/Log4JLogger.java
+++ b/modules/log4j/src/main/java/org/apache/ignite/logger/log4j/Log4JLogger.java
@@ -35,10 +35,12 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.logger.LoggerNodeIdAware;
 import org.apache.log4j.Appender;
+import org.apache.log4j.AppenderSkeleton;
 import org.apache.log4j.Category;
 import org.apache.log4j.ConsoleAppender;
 import org.apache.log4j.FileAppender;
 import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.PatternLayout;
 import org.apache.log4j.varia.LevelRangeFilter;
@@ -78,6 +80,9 @@ import static org.apache.ignite.IgniteSystemProperties.IGNITE_QUIET;
  * injection.
  */
 public class Log4JLogger implements IgniteLogger, LoggerNodeIdAware, Log4jFileAware {
+    /** */
+    public static final String CONSOLE_ERR_APPENDER_NAME = "CONSOLE_ERR";
+
     /** Appenders. */
     private static Collection<FileAppender> fileAppenders = new GridConcurrentHashSet<>();
 
@@ -308,7 +313,7 @@ public class Log4JLogger implements IgniteLogger, LoggerNodeIdAware, Log4jFileAw
                         Appender appender = (Appender)appenders.nextElement();
 
                         if (appender instanceof ConsoleAppender) {
-                            if ("CONSOLE_ERR".equals(appender.getName())) {
+                            if (CONSOLE_ERR_APPENDER_NAME.equals(appender.getName())) {
                                 // Treat CONSOLE_ERR appender as a system one and don't count it.
                                 errAppender = (ConsoleAppender)appender;
 
@@ -347,17 +352,27 @@ public class Log4JLogger implements IgniteLogger, LoggerNodeIdAware, Log4jFileAw
                     if (errAppender.getThreshold() == Level.ERROR)
                         errAppender.setThreshold(Level.WARN);
                 }
-                else
-                    // No error console appender => create console appender with no level limit.
-                    rootCategory.addAppender(createConsoleAppender(Level.OFF));
+                else {
+                    // No error console appender => create console appender with.
+                    final AppenderSkeleton consoleAppender = createConsoleAppender(Level.OFF);
+
+                    consoleAppender.setThreshold(Level.INFO);
 
-                if (logLevel != null)
+                    rootCategory.addAppender(consoleAppender);
+                }
+
+                // Won't raise LogLevel if there is other loggers configured. As LogLevel can be inherited.
+                if (logLevel != null && !logLevel.isGreaterOrEqual(impl.getEffectiveLevel())) {
                     impl.setLevel(logLevel);
-            }
 
-            // If still don't have appenders, disable logging.
-            if (!isConfigured())
+                    impl.warn("RootLogger logging level has been dropped by Apache Ignite.\n"+
+                    "Set lower log level or configure ConsoleAppender manually or disable ConsoleAppender automatic creation.");
+                }
+            }
+            else if (!isConfigured() && !hasOtherLoggers()) {
+                // If still don't have appenders and other loggers configured, disable logging.
                 impl.setLevel(Level.OFF);
+            }
 
             quiet0 = quiet;
             inited = true;
@@ -365,16 +380,34 @@ public class Log4JLogger implements IgniteLogger, LoggerNodeIdAware, Log4jFileAw
     }
 
     /**
+     * Checks if there is other loggers configured.
+     *
+     * @return {@code True} if other logger found.
+     */
+    private boolean hasOtherLoggers() {
+        final Enumeration loggers = LogManager.getCurrentLoggers();
+
+        while (loggers.hasMoreElements()) {
+            Logger c = (Logger)loggers.nextElement();
+
+            if (c != impl && c.getAllAppenders().hasMoreElements())
+                return true;
+        }
+
+        return false;
+    }
+
+    /**
      * Creates console appender with some reasonable default logging settings.
      *
      * @param maxLevel Max logging level.
      * @return New console appender.
      */
-    private Appender createConsoleAppender(Level maxLevel) {
+    private AppenderSkeleton createConsoleAppender(Level maxLevel) {
         String fmt = "[%d{ABSOLUTE}][%-5p][%t][%c{1}] %m%n";
 
         // Configure output that should go to System.out
-        Appender app = new ConsoleAppender(new PatternLayout(fmt), ConsoleAppender.SYSTEM_OUT);
+        AppenderSkeleton app = new ConsoleAppender(new PatternLayout(fmt), ConsoleAppender.SYSTEM_OUT);
 
         LevelRangeFilter lvlFilter = new LevelRangeFilter();
 
@@ -532,4 +565,15 @@ public class Log4JLogger implements IgniteLogger, LoggerNodeIdAware, Log4jFileAw
             }
         }
     }
+
+    /**
+     * For test purposes only.
+     */
+    static void reset(){
+        inited = false;
+
+        quiet0 = false;
+
+        fileAppenders.clear();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/01ceeb13/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jInitializationTest.java
----------------------------------------------------------------------
diff --git a/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jInitializationTest.java b/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jInitializationTest.java
new file mode 100644
index 0000000..2a98490
--- /dev/null
+++ b/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jInitializationTest.java
@@ -0,0 +1,212 @@
+/*
+ * 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.ignite.logger.log4j;
+
+import junit.framework.TestCase;
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.IgniteSystemProperties;
+import org.apache.ignite.testframework.junits.common.GridCommonTest;
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.varia.NullAppender;
+
+/**
+ * Log4j not initialized test.
+ */
+@GridCommonTest(group = "Logger")
+public class GridLog4jInitializationTest extends TestCase {
+    /** */
+    private static final boolean VERBOSE = true;
+
+    /** {@inheritDoc} */
+    @Override public void setUp() throws Exception {
+        super.setUp();
+
+        resetLogger();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void tearDown() throws Exception {
+        super.tearDown();
+
+        resetLogger();
+    }
+
+    /** */
+    private void resetLogger() {
+        Log4JLogger.reset();
+
+        LogManager.resetConfiguration();
+
+        System.clearProperty(IgniteSystemProperties.IGNITE_QUIET);
+    }
+
+    /** */
+    public void testLogNotInitialized() {
+        IgniteLogger log = new Log4JLogger().getLogger(GridLog4jInitializationTest.class);
+
+        if (VERBOSE)
+            printLoggerResults(log);
+
+        assertTrue(log instanceof Log4JLogger);
+
+        assertEquals(Level.OFF, LogManager.getRootLogger().getEffectiveLevel());
+    }
+
+    /** */
+    public void testLogInitialized() {
+        BasicConfigurator.configure();
+
+        IgniteLogger log = new Log4JLogger().getLogger(GridLog4jInitializationTest.class);
+
+        if (VERBOSE)
+            printLoggerResults(log);
+
+        assertTrue(log instanceof Log4JLogger);
+
+        assertEquals(Level.DEBUG, LogManager.getRootLogger().getEffectiveLevel());
+    }
+
+    /** */
+    public void testNoAppendersConfigured() {
+        LogManager.getRootLogger().setLevel(Level.WARN);
+
+        final Logger logger = LogManager.getLogger(GridLog4jInitializationTest.class);
+
+        assertEquals(Level.WARN, logger.getEffectiveLevel());
+
+        IgniteLogger log = new Log4JLogger().getLogger(GridLog4jInitializationTest.class);
+
+        if (VERBOSE)
+            printLoggerResults(log);
+
+        assertEquals(Level.OFF, logger.getEffectiveLevel());
+    }
+
+    /** */
+    public void testAutoAddConsoleAppender() {
+        System.setProperty(IgniteSystemProperties.IGNITE_QUIET, String.valueOf(false));
+
+        LogManager.getRootLogger().setLevel(Level.WARN);
+
+        final Logger logger = LogManager.getLogger(GridLog4jInitializationTest.class);
+
+        assertEquals(Level.WARN, logger.getEffectiveLevel());
+
+        IgniteLogger log = new Log4JLogger().getLogger(GridLog4jInitializationTest.class);
+
+        if (VERBOSE)
+            printLoggerResults(log);
+
+        assertEquals(Level.INFO, logger.getEffectiveLevel()); // LogLevel is allowed to be dropped.
+    }
+
+    /** */
+    public void testAutoAddConsoleAppender2() {
+        System.setProperty(IgniteSystemProperties.IGNITE_QUIET, String.valueOf(false));
+
+        LogManager.getRootLogger().setLevel(Level.DEBUG);
+
+        final Logger logger = LogManager.getLogger(GridLog4jInitializationTest.class);
+
+        assertEquals(Level.DEBUG, logger.getEffectiveLevel());
+
+        IgniteLogger log = new Log4JLogger().getLogger(GridLog4jInitializationTest.class);
+
+        if (VERBOSE)
+            printLoggerResults(log);
+
+        assertEquals(Level.DEBUG, logger.getEffectiveLevel()); // LogLevel should not change.
+    }
+
+    /** */
+    public void testOtherLoggerConfigured() {
+        LogManager.getRootLogger().setLevel(Level.DEBUG);
+
+        final Logger logger = LogManager.getLogger(GridLog4jInitializationTest.class);
+
+        logger.addAppender(new NullAppender());
+
+        assertEquals(Level.DEBUG, logger.getEffectiveLevel());
+
+        IgniteLogger log = new Log4JLogger().getLogger(GridLog4jInitializationTest.class);
+
+        if (VERBOSE)
+            printLoggerResults(log);
+
+        assertEquals(Level.DEBUG, logger.getEffectiveLevel()); // LogLevel should not be OFF.
+    }
+
+    /** */
+    public void testAutoAddConsoleAppenderWithOtherLoggerConfigured() {
+        System.setProperty(IgniteSystemProperties.IGNITE_QUIET, String.valueOf(false));
+
+        LogManager.getRootLogger().setLevel(Level.DEBUG);
+
+        final Logger logger = LogManager.getLogger(GridLog4jInitializationTest.class);
+
+        logger.addAppender(new NullAppender());
+
+        assertEquals(Level.DEBUG, logger.getEffectiveLevel());
+
+        IgniteLogger log = new Log4JLogger().getLogger(GridLog4jInitializationTest.class);
+
+        if (VERBOSE)
+            printLoggerResults(log);
+
+        assertEquals(Level.DEBUG, logger.getEffectiveLevel()); // LogLevel should not be raised.
+    }
+
+    /** */
+    public void testAutoAddConsoleAppenderWithOtherLoggerConfigured2() {
+        System.setProperty(IgniteSystemProperties.IGNITE_QUIET, String.valueOf(false));
+
+        LogManager.getRootLogger().setLevel(Level.WARN);
+
+        final Logger logger = LogManager.getLogger(GridLog4jInitializationTest.class);
+
+        logger.addAppender(new NullAppender());
+
+        assertEquals(Level.WARN, logger.getEffectiveLevel());
+
+        IgniteLogger log = new Log4JLogger().getLogger(GridLog4jInitializationTest.class);
+
+        if (VERBOSE)
+            printLoggerResults(log);
+
+        assertEquals(Level.INFO, logger.getEffectiveLevel()); // LogLevel is allowed to be dropped.
+    }
+
+    /** */
+    private void printLoggerResults(IgniteLogger log) {
+        if (log.isDebugEnabled())
+            log.debug("This is 'debug' message.");
+        else
+            System.out.println("DEBUG level is not enabled.");
+
+        if (log.isInfoEnabled())
+            log.info("This is 'info' message.");
+        else
+            System.out.println("INFO level is not enabled.");
+
+        log.warning("This is 'warning' message.");
+        log.error("This is 'error' message.");
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/01ceeb13/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jInitializedTest.java
----------------------------------------------------------------------
diff --git a/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jInitializedTest.java b/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jInitializedTest.java
deleted file mode 100644
index 94907f0..0000000
--- a/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jInitializedTest.java
+++ /dev/null
@@ -1,55 +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.ignite.logger.log4j;
-
-import junit.framework.TestCase;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.testframework.junits.common.GridCommonTest;
-import org.apache.log4j.BasicConfigurator;
-
-/**
- * Log4j initialized test.
- */
-@GridCommonTest(group = "Logger")
-public class GridLog4jInitializedTest extends TestCase {
-
-    /**
-     * @throws Exception If failed.
-     */
-    @Override protected void setUp() throws Exception {
-        BasicConfigurator.configure();
-    }
-
-    /** */
-    public void testLogInitialize() {
-        IgniteLogger log = new Log4JLogger();
-
-        assert log.isInfoEnabled() == true;
-
-        if (log.isDebugEnabled())
-            log.debug("This is 'debug' message.");
-
-        log.info("This is 'info' message.");
-        log.warning("This is 'warning' message.");
-        log.warning("This is 'warning' message.", new Exception("It's a test warning exception"));
-        log.error("This is 'error' message.");
-        log.error("This is 'error' message.", new Exception("It's a test error exception"));
-
-        assert log.getLogger(GridLog4jInitializedTest.class.getName()) instanceof Log4JLogger;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/01ceeb13/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jNotInitializedTest.java
----------------------------------------------------------------------
diff --git a/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jNotInitializedTest.java b/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jNotInitializedTest.java
deleted file mode 100644
index 390fdcb..0000000
--- a/modules/log4j/src/test/java/org/apache/ignite/logger/log4j/GridLog4jNotInitializedTest.java
+++ /dev/null
@@ -1,46 +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.ignite.logger.log4j;
-
-import junit.framework.TestCase;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.testframework.junits.common.GridCommonTest;
-
-/**
- * Log4j not initialized test.
- */
-@GridCommonTest(group = "Logger")
-public class GridLog4jNotInitializedTest extends TestCase {
-    /** */
-    public void testLogInitialize() {
-        IgniteLogger log = new Log4JLogger().getLogger(GridLog4jNotInitializedTest.class);
-
-        if (log.isDebugEnabled())
-            log.debug("This is 'debug' message.");
-        else
-            System.out.println("DEBUG level is not enabled.");
-
-        if (log.isInfoEnabled())
-            log.info("This is 'info' message.");
-        else
-            System.out.println("INFO level is not enabled.");
-
-        log.warning("This is 'warning' message.");
-        log.error("This is 'error' message.");
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/01ceeb13/modules/log4j/src/test/java/org/apache/ignite/testsuites/IgniteLog4jTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/log4j/src/test/java/org/apache/ignite/testsuites/IgniteLog4jTestSuite.java b/modules/log4j/src/test/java/org/apache/ignite/testsuites/IgniteLog4jTestSuite.java
index f5f13d9..e20d32c 100644
--- a/modules/log4j/src/test/java/org/apache/ignite/testsuites/IgniteLog4jTestSuite.java
+++ b/modules/log4j/src/test/java/org/apache/ignite/testsuites/IgniteLog4jTestSuite.java
@@ -19,8 +19,7 @@ package org.apache.ignite.testsuites;
 
 import junit.framework.TestSuite;
 import org.apache.ignite.logger.log4j.GridLog4jCorrectFileNameTest;
-import org.apache.ignite.logger.log4j.GridLog4jInitializedTest;
-import org.apache.ignite.logger.log4j.GridLog4jNotInitializedTest;
+import org.apache.ignite.logger.log4j.GridLog4jInitializationTest;
 
 /**
  * Log4j logging tests.
@@ -33,8 +32,7 @@ public class IgniteLog4jTestSuite extends TestSuite {
     public static TestSuite suite() throws Exception {
         TestSuite suite = new TestSuite("Log4j Logging Test Suite");
 
-        suite.addTest(new TestSuite(GridLog4jInitializedTest.class));
-        suite.addTest(new TestSuite(GridLog4jNotInitializedTest.class));
+        suite.addTest(new TestSuite(GridLog4jInitializationTest.class));
         suite.addTest(new TestSuite(GridLog4jCorrectFileNameTest.class));
 
         return suite;