--- old/src/java.logging/share/classes/java/util/logging/Level.java 2017-12-08 15:46:44.000000000 +0000 +++ new/src/java.logging/share/classes/java/util/logging/Level.java 2017-12-08 15:46:44.000000000 +0000 @@ -389,14 +389,15 @@ try { int x = Integer.parseInt(name); level = KnownLevel.findByValue(x, KnownLevel::mirrored); - if (!level.isPresent()) { - // add new Level - Level levelObject = new Level(name, x); - // There's no need to use a reachability fence here because - // KnownLevel keeps a strong reference on the level when - // level.getClass() == Level.class. - return KnownLevel.findByValue(x, KnownLevel::mirrored).get(); + if (level.isPresent()) { + return level.get(); } + // add new Level + Level levelObject = new Level(name, x); + // There's no need to use a reachability fence here because + // KnownLevel keeps a strong reference on the level when + // level.getClass() == Level.class. + return KnownLevel.findByValue(x, KnownLevel::mirrored).get(); } catch (NumberFormatException ex) { // Not an integer. // Drop through. --- old/test/jdk/java/util/logging/Level/CustomLevel.java 2017-12-08 15:46:45.000000000 +0000 +++ new/test/jdk/java/util/logging/Level/CustomLevel.java 2017-12-08 15:46:45.000000000 +0000 @@ -22,6 +22,8 @@ */ import java.io.*; +import java.lang.management.ManagementFactory; +import java.lang.management.PlatformLoggingMXBean; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; @@ -35,9 +37,10 @@ /* * @test - * @bug 8026027 6543126 + * @bug 8026027 6543126 8187073 + * @modules java.management * @summary Test Level.parse to look up custom levels by name and its - * localized name + * localized name, as well as severity. * * @run main/othervm CustomLevel */ @@ -73,6 +76,8 @@ public static void main(String[] args) throws Exception { setupCustomLevels(); setUpCustomLevelsOtherLoader(); + PlatformLoggingMXBean mxbean = ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class); + Logger logger = Logger.getLogger("foo.bar"); // Level.parse will return the custom Level instance for (Level level : levels) { @@ -96,8 +101,27 @@ + l.getClass() + " for " + localizedName + " in " + rb.getBaseBundleName()); } + l = Level.parse(String.valueOf(level.intValue())); + System.out.println("Level.parse(" + level.intValue() + ") returns " + l); + if (l != level) { + if (l == null || l.intValue() != level.intValue()) { + throw new RuntimeException("Unexpected level " + l + + (l == null ? "" : (" " + l.getClass())) + + " for " + level.intValue()); + } + } + mxbean.setLoggerLevel(logger.getName(), String.valueOf(level.intValue())); + Level l2 = logger.getLevel(); + if (l2 != level) { + if (l2 == null || l2.intValue() != level.intValue()) { + throw new RuntimeException("Unexpected level " + l2 + + (l2 == null ? "" : (" " + l2.getClass())) + + " for " + level.intValue()); + } + } } + final long otherLevelCount = levels.stream() .filter(CustomLevel::isCustomLoader) .count();