/** * Sets the level on {@code logger} to {@code newLevel}. Any child loggers currently inheriting * their level from {@code logger} will be updated recursively. * * @param newLevel the new minimum logging threshold. If null, the logger's parent level will be * used; or {@code Level.INFO} for loggers with no parent. */ synchronized void setLevelRecursively(Logger logger, Level newLevel) { int previous = logger.levelIntVal; logger.levelObjVal = newLevel; if (newLevel == null) { logger.levelIntVal = logger.parent != null ? logger.parent.levelIntVal : Level.INFO.intValue(); } else { logger.levelIntVal = newLevel.intValue(); } if (previous != logger.levelIntVal) { for (Logger child : logger.children) { if (child.levelObjVal == null) { setLevelRecursively(child, null); } } } }