--- old/src/java.logging/share/classes/java/util/logging/LogManager.java 2014-10-10 16:56:43.000000000 +0200 +++ new/src/java.logging/share/classes/java/util/logging/LogManager.java 2014-10-10 16:56:43.000000000 +0200 @@ -31,6 +31,7 @@ import java.security.*; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; +import java.util.concurrent.CopyOnWriteArrayList; import sun.misc.JavaAWTAccess; import sun.misc.SharedSecrets; @@ -169,6 +170,33 @@ // True if JVM death is imminent and the exit hook has been called. private boolean deathImminent; + // This list contains the loggers for which some handlers have been + // explicitely configured in the configuration file. + // It prevents these loggers from being arbitrarily garbage collected. + private static final class PersistentLogger { + private final Logger logger; + private PersistentLogger(Logger ref) { + this.logger = Objects.requireNonNull(ref); + } + @Override + public boolean equals(Object other) { + return (other instanceof PersistentLogger) && ((PersistentLogger)other).logger == logger; + } + @Override + public int hashCode() { + return System.identityHashCode(logger); + } + public Logger get() { + return logger; + } + public static PersistentLogger create(Logger logger) { + return new PersistentLogger(logger); + } + } + private final CopyOnWriteArrayList persistentLoggers = + new CopyOnWriteArrayList<>(); + + private final Map listeners = Collections.synchronizedMap(new IdentityHashMap<>()); @@ -204,7 +232,6 @@ }); } - // This private class is used as a shutdown hook. // It does a "reset" to close all open handlers. private class Cleaner extends Thread { @@ -875,6 +902,7 @@ @Override public Object run() { String names[] = parseClassNames(handlersPropertyName); + int count = 0; for (String word : names) { try { Class clz = ClassLoader.getSystemClassLoader().loadClass(word); @@ -893,12 +921,18 @@ } // Add this Handler to the logger logger.addHandler(hdl); + if (++count == 1) { + // add this logger to the persitentLoggers list. + persistentLoggers.addIfAbsent( + PersistentLogger.create(logger)); + } } catch (Exception ex) { System.err.println("Can't load log handler \"" + word + "\""); System.err.println("" + ex); ex.printStackTrace(); } } + return null; } });