52
52
public void run() {
53
// The JVM us being shutdown. Make sure all loggers for all class
54
// loaders are shutdown
55
for (ClassLoaderLogInfo clLogInfo : classLoaderLoggers.values()) {
56
for (Logger logger : clLogInfo.loggers.values()) {
62
private void resetLogger(Logger logger) {
64
Handler[] handlers = logger.getHandlers();
65
for (Handler handler : handlers) {
66
logger.removeHandler(handler);
69
} catch (Exception e) {
53
if (useShutdownHook) {
106
89
protected ThreadLocal<String> prefix = new ThreadLocal<String>();
93
* Determines if the shutdown hook is used to perform any necessary
94
* clean-up such as flushing buffered handlers on JVM shutdown. Defaults to
95
* <code>true</code> but may be set to false if another component ensures
96
* that {@link #shutdown()} is called.
98
protected volatile boolean useShutdownHook = true;
101
// ------------------------------------------------------------- Properties
104
public boolean isUseShutdownHook() {
105
return useShutdownHook;
109
public void setUseShutdownHook(boolean useShutdownHook) {
110
this.useShutdownHook = useShutdownHook;
109
114
// --------------------------------------------------------- Public Methods
291
296
readConfiguration(is, Thread.currentThread().getContextClassLoader());
301
public void reset() throws SecurityException {
302
Thread thread = Thread.currentThread();
303
if (thread.getClass().getName().startsWith(
304
"java.util.logging.LogManager$")) {
305
// Ignore the call from java.util.logging.LogManager.Cleaner,
306
// because we have our own shutdown hook
309
ClassLoader classLoader = thread.getContextClassLoader();
310
ClassLoaderLogInfo clLogInfo = getClassLoaderInfo(classLoader);
311
resetLoggers(clLogInfo);
316
* Shuts down the logging system.
318
public void shutdown() {
319
// The JVM us being shutdown. Make sure all loggers for all class
320
// loaders are shutdown
321
for (ClassLoaderLogInfo clLogInfo : classLoaderLoggers.values()) {
322
resetLoggers(clLogInfo);
326
// -------------------------------------------------------- Private Methods
327
private void resetLoggers(ClassLoaderLogInfo clLogInfo) {
328
// This differs from LogManager#resetLogger() in that we close not all
329
// handlers of all loggers, but only those that are present in our
330
// ClassLoaderLogInfo#handlers list. That is because our #addLogger(..)
331
// method can use handlers from the parent class loaders, and closing
332
// handlers that the current class loader does not own would be not
334
synchronized (clLogInfo) {
335
for (Logger logger : clLogInfo.loggers.values()) {
336
Handler[] handlers = logger.getHandlers();
337
for (Handler handler : handlers) {
338
logger.removeHandler(handler);
341
for (Handler handler : clLogInfo.handlers.values()) {
344
} catch (Exception e) {
348
clLogInfo.handlers.clear();
295
352
// ------------------------------------------------------ Protected Methods