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");
