Mercurial > hg > release > icedtea7-forest-2.4 > jdk
changeset 7284:9aaea012e6f3
8029740: Enhance handling of loggers
Reviewed-by: mchung, ahgross
author | dfuchs |
---|---|
date | Thu, 16 Jan 2014 15:13:15 +0100 |
parents | 99c62bfd15c4 |
children | 487fd431bad4 402b13fc601a |
files | src/share/classes/java/util/logging/LogManager.java src/share/classes/java/util/logging/Logger.java |
diffstat | 2 files changed, 40 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/util/logging/LogManager.java Wed Jan 15 17:56:27 2014 +0000 +++ b/src/share/classes/java/util/logging/LogManager.java Thu Jan 16 15:13:15 2014 +0100 @@ -424,7 +424,7 @@ Logger result = getLogger(name); if (result == null) { // only allocate the new logger once - Logger newLogger = new Logger(name, resourceBundleName, caller); + Logger newLogger = new Logger(name, resourceBundleName, caller, false); do { if (addLogger(newLogger)) { // We successfully added the new Logger that we @@ -471,12 +471,12 @@ } while (logger == null); // LogManager will set the sysLogger's handlers via LogManager.addLogger method. - if (logger != sysLogger && sysLogger.getHandlers().length == 0) { + if (logger != sysLogger && sysLogger.accessCheckedHandlers().length == 0) { // if logger already exists but handlers not set final Logger l = logger; AccessController.doPrivileged(new PrivilegedAction<Void>() { public Void run() { - for (Handler hdl : l.getHandlers()) { + for (Handler hdl : l.accessCheckedHandlers()) { sysLogger.addHandler(hdl); } return null; @@ -760,7 +760,7 @@ Logger result = findLogger(name); if (result == null) { // only allocate the new system logger once - Logger newLogger = new Logger(name, resourceBundleName); + Logger newLogger = new Logger(name, resourceBundleName, null, true); do { if (addLocalLogger(newLogger)) { // We successfully added the new Logger that we @@ -1425,31 +1425,35 @@ // We use a subclass of Logger for the root logger, so // that we only instantiate the global handlers when they // are first needed. - private class RootLogger extends Logger { + private final class RootLogger extends Logger { private RootLogger() { - super("", null); + super("", null, null, true); setLevel(defaultLevel); } + @Override public void log(LogRecord record) { // Make sure that the global handlers have been instantiated. initializeGlobalHandlers(); super.log(record); } + @Override public void addHandler(Handler h) { initializeGlobalHandlers(); super.addHandler(h); } + @Override public void removeHandler(Handler h) { initializeGlobalHandlers(); super.removeHandler(h); } - public Handler[] getHandlers() { + @Override + Handler[] accessCheckedHandlers() { initializeGlobalHandlers(); - return super.getHandlers(); + return super.accessCheckedHandlers(); } }
--- a/src/share/classes/java/util/logging/Logger.java Wed Jan 15 17:56:27 2014 +0000 +++ b/src/share/classes/java/util/logging/Logger.java Thu Jan 16 15:13:15 2014 +0100 @@ -178,7 +178,7 @@ private String name; private final CopyOnWriteArrayList<Handler> handlers = new CopyOnWriteArrayList<>(); - private String resourceBundleName; + private volatile String resourceBundleName; private volatile boolean useParentHandlers = true; private volatile Filter filter; private boolean anonymous; @@ -189,7 +189,7 @@ // The fields relating to parent-child relationships and levels // are managed under a separate lock, the treeLock. - private static Object treeLock = new Object(); + private static final Object treeLock = new Object(); // We keep weak references from parents to children, but strong // references from children to parents. private volatile Logger parent; // our nearest parent. @@ -197,6 +197,7 @@ private volatile Level levelObject; private volatile int levelValue; // current effective level value private WeakReference<ClassLoader> callersClassLoaderRef; + private final boolean isSystemLogger; /** * GLOBAL_LOGGER_NAME is a name for the global logger. @@ -257,11 +258,12 @@ * no corresponding resource can be found. */ protected Logger(String name, String resourceBundleName) { - this(name, resourceBundleName, null); + this(name, resourceBundleName, null, false); } - Logger(String name, String resourceBundleName, Class<?> caller) { + Logger(String name, String resourceBundleName, Class<?> caller, boolean isSystemLogger) { this.manager = LogManager.getLogManager(); + this.isSystemLogger = isSystemLogger; setupResourceInfo(resourceBundleName, caller); this.name = name; levelValue = Level.INFO.intValue(); @@ -288,6 +290,7 @@ private Logger(String name) { // The manager field is not initialized here. this.name = name; + this.isSystemLogger = true; levelValue = Level.INFO.intValue(); } @@ -528,7 +531,7 @@ // cleanup some Loggers that have been GC'ed manager.drainLoggerRefQueueBounded(); Logger result = new Logger(null, resourceBundleName, - Reflection.getCallerClass()); + Reflection.getCallerClass(), false); result.anonymous = true; Logger root = manager.getLogger(""); result.doSetParent(root); @@ -606,15 +609,22 @@ Logger logger = this; while (logger != null) { - for (Handler handler : logger.getHandlers()) { + final Handler[] loggerHandlers = isSystemLogger + ? logger.accessCheckedHandlers() + : logger.getHandlers(); + for (Handler handler : loggerHandlers) { handler.publish(record); } - if (!logger.getUseParentHandlers()) { + final boolean useParentHdls = isSystemLogger + ? logger.useParentHandlers + : logger.getUseParentHandlers(); + + if (!useParentHdls) { break; } - logger = logger.getParent(); + logger = isSystemLogger ? logger.parent : logger.getParent(); } } @@ -1337,6 +1347,12 @@ * @return an array of all registered Handlers */ public Handler[] getHandlers() { + return accessCheckedHandlers(); + } + + // This method should ideally be marked final - but unfortunately + // it needs to be overridden by LogManager.RootLogger + Handler[] accessCheckedHandlers() { return handlers.toArray(emptyHandlers); } @@ -1669,11 +1685,13 @@ private String getEffectiveResourceBundleName() { Logger target = this; while (target != null) { - String rbn = target.getResourceBundleName(); + final String rbn = isSystemLogger + ? target.resourceBundleName + : target.getResourceBundleName(); if (rbn != null) { return rbn; } - target = target.getParent(); + target = isSystemLogger ? target.parent : target.getParent(); } return null; }