Repository: logging-log4j2
Updated Branches:
  refs/heads/master b4514e374 -> e760529f6


[LOG4J2-1090] Add Core Configurator APIs to change a logger's level.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/e760529f
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/e760529f
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/e760529f

Branch: refs/heads/master
Commit: e760529f681eff401601f234cc81bba09cb1a768
Parents: b4514e3
Author: ggregory <[email protected]>
Authored: Sat Aug 22 13:51:13 2015 -0700
Committer: ggregory <[email protected]>
Committed: Sat Aug 22 13:51:13 2015 -0700

----------------------------------------------------------------------
 .../logging/log4j/core/config/Configurator.java | 24 ++++++++++++++++++++
 .../apache/logging/log4j/core/LoggerTest.java   | 20 ++++++++++++++++
 2 files changed, 44 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e760529f/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
index 256fc1c..e3ea113 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
@@ -164,6 +164,30 @@ public final class Configurator {
         return initialize(name, null, configLocation);
     }
 
+    /**
+     * Sets the levels of <code>parentLogger</code> and all 'child' loggers to 
the given <code>level</level>.
+     * @param parentLogger the parent logger
+     * @param level the new level
+     */
+    public static void setChildren(final String parentLogger, final Level 
level) {
+        // 1) get logger config
+        // 2) if exact match, use it, if not, create it.
+        // 3) set level on logger config 
+        // 4) update child logger configs with level
+        // 5) update loggers
+        final LoggerContext loggerContext = LoggerContext.getContext(false);
+        final Configuration config = loggerContext.getConfiguration();
+        boolean set = setLevel(parentLogger, level, config);
+        for (final Map.Entry<String, LoggerConfig> entry : 
config.getLoggers().entrySet()) {
+            if (entry.getKey().startsWith(parentLogger)) {
+                set |= setLevel(entry.getValue(), level);
+            }
+        }
+        if (set) {
+            loggerContext.updateLoggers();
+        }
+    }
+
     private static boolean setLevel(final LoggerConfig loggerConfig, final 
Level level) {
         final boolean set = !loggerConfig.getLevel().equals(level);
         if (set) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e760529f/log4j-core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
index 1f70523..81d7aa7 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
@@ -133,6 +133,26 @@ public class LoggerTest {
     }
 
     @Test
+    public void debugChangeLevelAllChildrenLoggers() {
+        // Use logger AND child loggers
+        logger.debug("Debug message 1");
+        loggerChild.debug("Debug message 1 child");
+        loggerGrandchild.debug("Debug message 1 grandchild");
+        final List<LogEvent> events = app.getEvents();
+        assertEventCount(events, 3);
+        Configurator.setChildren(logger.getName(), Level.OFF);
+        logger.debug("Debug message 2");
+        loggerChild.warn("Warn message 2 child");
+        loggerGrandchild.fatal("Fatal message 2 grandchild");
+        assertEventCount(events, 3);
+        Configurator.setChildren(logger.getName(), Level.DEBUG);
+        logger.debug("Debug message 3");
+        loggerChild.warn("Trace message 3 child");
+        loggerGrandchild.trace("Fatal message 3 grandchild");
+        assertEventCount(events, 5);
+    }
+
+    @Test
     public void debugChangeLevelChildLogger() {
         // Use logger AND child loggers
         logger.debug("Debug message 1");

Reply via email to