svn commit: r1945 - in logback/trunk: logback-classic/src/main/java/ch/qos/logback/classic logback-classic/src/main/java/ch/qos/logback/classic/jmx logback-classic/src/main/java/ch/qos/logback/classic/joran/action logback-classic/src/main/java/ch/qos/logback/classic/net logback-classic/src/main/java/ch/qos/logback/classic/selector logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet logback-classic/src/main/java/ch/qos/logback/classic/spi logback-classic/src/main/java/ch/qos/l

Author: ceki Date: Tue Nov 4 20:23:14 2008 New Revision: 1945 Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java - copied, changed from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfiguratorMBean.java - copied, changed from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/MBeanUtil.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextListener.java - copied, changed from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ContextListener.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/PackageTest.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusListenerAsList.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusUtil.java Removed: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ContextListener.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/XTurboFilterAttachable.java Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicContextListener.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ContextListenerTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationTest.java logback/trunk/logback-classic/src/test/java/org/dummy/Log4jInvocation.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/RandomUtil.java logback/trunk/logback-examples/src/main/java/chapter2/MyAppWithConfigFile.java logback/trunk/logback-examples/src/main/java/chapter3/MyApp3.java logback/trunk/logback-examples/src/main/java/chapter4/ConfigurationTester.java logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes1.java logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes2.java logback/trunk/logback-examples/src/main/java/chapter4/mail/EMail.java logback/trunk/logback-examples/src/main/java/chapter4/socket/SocketClient2.java logback/trunk/logback-examples/src/main/java/chapter5/CallerEvaluatorExample.java logback/trunk/logback-examples/src/main/java/chapter5/ExceptionEvaluatorExample.java logback/trunk/logback-examples/src/main/java/chapter5/GoMDC.java logback/trunk/logback-examples/src/main/java/chapter5/SampleLogging.java logback/trunk/logback-examples/src/main/java/chapter6/FilterEvents.java logback/trunk/logback-examples/src/main/java/chapter7/NumberCruncherServer.java logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java Log: This commit is related to: LBCLASSIC-61 (configurable ObjectName) LBCLASSIC-24 (better error messages after reload) LBCLASSIC-33 (JMX configurator unregisters itself) - Refactoring of LoggerContext class so it has a cleaner lifecycle - Major refactorization of c.q.l.c.jmx.Configurator (renamed as JMXConfigurator) in order to fix the aforementioned bugs More updates to follow Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java Tue Nov 4 20:23:14 2008 @@ -20,7 +20,7 @@ import org.slf4j.ILoggerFactory; import org.slf4j.Marker; -import ch.qos.logback.classic.spi.ContextListener; +import ch.qos.logback.classic.spi.LoggerContextListener; import ch.qos.logback.classic.spi.LoggerComparator; import ch.qos.logback.classic.spi.LoggerContextRemoteView; import ch.qos.logback.classic.spi.TurboFilterList; @@ -50,7 +50,7 @@ final Logger root; private int size; private int noAppenderWarning = 0; - final private List<ContextListener> contextListenerList = new ArrayList<ContextListener>(); + final private List<LoggerContextListener> loggerContextListenerList = new ArrayList<LoggerContextListener>(); // We want loggerCache to be synchronized so Hashtable is a good choice. In // practice, it performs a little faster than the map returned by @@ -189,15 +189,24 @@ return loggerContextRemoteView; } - public void shutdownAndReset() { + public void reset() { root.recursiveReset(); clearAllTurboFilters(); fireOnReset(); // TODO is it a good idea to reset the status listeners? resetStatusListeners(); + resetListeners(); + } + + /** + * @deprecated Please use reset() method instead + */ + + public void shutdownAndReset() { + reset(); } - void resetStatusListeners() { + private void resetStatusListeners() { StatusManager sm = getStatusManager(); for (StatusListener sl : sm.getCopyOfStatusListenerList()) { sm.remove(sl); @@ -207,7 +216,7 @@ public TurboFilterList getTurboFilterList() { return turboFilterList; } - + public void addTurboFilter(TurboFilter newFilter) { turboFilterList.add(newFilter); } @@ -246,26 +255,37 @@ format, new Object[] { param1, param2 }, t); } - public void addListener(ContextListener listener) { - contextListenerList.add(listener); + // === start listeners ============================================== + public void addListener(LoggerContextListener listener) { + loggerContextListenerList.add(listener); + } + + public void removeListener(LoggerContextListener listener) { + loggerContextListenerList.remove(listener); } - public void removeListener(ContextListener listener) { - contextListenerList.remove(listener); + private void resetListeners() { + loggerContextListenerList.clear(); + } + + public List<LoggerContextListener> getCopyOfListenerList() { + return new ArrayList<LoggerContextListener>(loggerContextListenerList); } private void fireOnReset() { - for (ContextListener listener : contextListenerList) { + for (LoggerContextListener listener : loggerContextListenerList) { listener.onReset(this); } } private void fireOnStart() { - for (ContextListener listener : contextListenerList) { + for (LoggerContextListener listener : loggerContextListenerList) { listener.onStart(this); } } + // === end listeners ============================================== + public boolean isStarted() { return started; } @@ -276,6 +296,7 @@ } public void stop() { + reset(); started = false; } Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java (from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java) ============================================================================== --- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java Tue Nov 4 20:23:14 2008 @@ -9,69 +9,118 @@ */ package ch.qos.logback.classic.jmx; +import java.io.File; +import java.io.FileNotFoundException; +import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import javax.management.InstanceNotFoundException; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServer; +import javax.management.ObjectName; + import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.classic.spi.LoggerContextListener; import ch.qos.logback.classic.util.ContextInitializer; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.spi.ContextAwareBase; import ch.qos.logback.core.status.Status; +import ch.qos.logback.core.status.StatusListenerAsList; +import ch.qos.logback.core.status.StatusManager; +import ch.qos.logback.core.util.StatusPrinter; /** - * A class that provides access to logback components via - * JMX. + * A class that provides access to logback components via JMX. + * + * <p>Since this class implements {@link JMXConfiguratorMBean} it has to be + * named as Configurator}. * - * * @author Ceki Gülcü * @author Sébastien Pennec * - * Contributor: - * Sebastian Davids - * See http://bugzilla.qos.ch/show_bug.cgi?id=35 + * Contributor: Sebastian Davids See http://bugzilla.qos.ch/show_bug.cgi?id=35 */ -public class Configurator extends ContextAwareBase implements - ConfiguratorMBean { +public class JMXConfigurator extends ContextAwareBase implements + JMXConfiguratorMBean, LoggerContextListener { private static String EMPTY = ""; - - public Configurator(LoggerContext loggerContext) { + + final LoggerContext loggerContext; + final MBeanServer mbs; + final ObjectName objectName; + + public JMXConfigurator(LoggerContext loggerContext, MBeanServer mbs, + ObjectName objectName) { this.context = loggerContext; + this.loggerContext = loggerContext; + this.mbs = mbs; + this.objectName = objectName; + removePreviousInstanceAsListener(); + loggerContext.addListener(this); + } + + private void removePreviousInstanceAsListener() { + List<LoggerContextListener> lcll = loggerContext.getCopyOfListenerList(); + + for (LoggerContextListener lcl : lcll) { + if (lcl instanceof JMXConfigurator) { + JMXConfigurator jmxConfigurator = (JMXConfigurator) lcl; + if (objectName.equals(jmxConfigurator.objectName)) { + addInfo("Removing previous JMXConfigurator from the logger context listener list"); + loggerContext.removeListener(lcl); + } + } + } } - public void reload() { - LoggerContext lc = (LoggerContext) context; - addInfo("Shutting down context: " + lc.getName()); - lc.shutdownAndReset(); - try { - new ContextInitializer(lc).autoConfig(); - addInfo("Context: " + lc.getName() + " reloaded."); - } catch(JoranException je) { - addError("Reloading of context: " + lc.getName() + " failed.", je); + public void reloadDefaultConfiguration() throws JoranException { + ContextInitializer ci = new ContextInitializer(loggerContext); + URL url = ci.findURLOfDefaultConfigurationFile(true); + reloadByURL(url); + } + + public void reloadByFileName(String fileName) throws JoranException, + FileNotFoundException { + File f = new File(fileName); + if (f.exists() && f.isFile()) { + URL url; + try { + url = f.toURI().toURL(); + reloadByURL(url); + } catch (MalformedURLException e) { + throw new RuntimeException( + "Unexpected MalformedURLException occured. See nexted cause.", e); + } + + } else { + String errMsg = "Could not find [" + fileName + "]"; + addInfo(errMsg); + throw new FileNotFoundException(errMsg); } } - public void reload(String fileName) throws JoranException { - LoggerContext lc = (LoggerContext) context; - addInfo("Shutting down context: " + lc.getName()); - lc.shutdownAndReset(); - JoranConfigurator configurator = new JoranConfigurator(); - configurator.setContext(lc); - configurator.doConfigure(fileName); - addInfo("Context: " + lc.getName() + " reloaded."); - } + public void reloadByURL(URL url) throws JoranException { + StatusListenerAsList statusListenerAsList = new StatusListenerAsList(); + StatusManager sm = loggerContext.getStatusManager(); + sm.add(statusListenerAsList); - public void reload(URL url) throws JoranException { - LoggerContext lc = (LoggerContext) context; - addInfo("Shutting down context: " + lc.getName()); - lc.shutdownAndReset(); - new ContextInitializer(lc).configureByResource(url); - addInfo("Context: " + lc.getName() + " reloaded."); + addInfo("Resetting context: " + loggerContext.getName()); + loggerContext.reset(); + + try { + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(loggerContext); + configurator.doConfigure(url); + addInfo("Context: " + loggerContext.getName() + " reloaded."); + } finally { + StatusPrinter.print(statusListenerAsList.getStatusList()); + } } public void setLoggerLevel(String loggerName, String levelStr) { @@ -83,10 +132,10 @@ } loggerName = loggerName.trim(); levelStr = levelStr.trim(); - + addInfo("Trying to set level " + levelStr + " to logger " + loggerName); LoggerContext lc = (LoggerContext) context; - + Logger logger = lc.getLogger(loggerName); if ("null".equalsIgnoreCase(levelStr)) { logger.setLevel(null); @@ -102,9 +151,9 @@ if (loggerName == null) { return EMPTY; } - + loggerName = loggerName.trim(); - + LoggerContext lc = (LoggerContext) context; Logger logger = lc.exists(loggerName); if (logger != null) { @@ -118,9 +167,9 @@ if (loggerName == null) { return EMPTY; } - + loggerName = loggerName.trim(); - + LoggerContext lc = (LoggerContext) context; Logger logger = lc.exists(loggerName); if (logger != null) { @@ -131,23 +180,54 @@ } public List<String> getLoggerList() { - LoggerContext lc = (LoggerContext)context; + LoggerContext lc = (LoggerContext) context; List<String> strList = new ArrayList<String>(); Iterator<Logger> it = lc.getLoggerList().iterator(); - while(it.hasNext()) { + while (it.hasNext()) { Logger log = it.next(); strList.add(log.getName()); } return strList; } - + public List<String> getStatuses() { List<String> list = new ArrayList<String>(); - Iterator<Status> it = context.getStatusManager().getCopyOfStatusList().iterator(); - while(it.hasNext()) { + Iterator<Status> it = context.getStatusManager().getCopyOfStatusList() + .iterator(); + while (it.hasNext()) { list.add(it.next().toString()); } return list; } + /** + * When the associated LoggerContext is reset, this configurator must be + * unregistered + */ + public void onReset(LoggerContext context) { + if (mbs.isRegistered(objectName)) { + try { + addInfo("Unregistering mbean [" + objectName + "]"); + mbs.unregisterMBean(objectName); + } catch (InstanceNotFoundException e) { + // this is theoretically impossible + addError("Unable to find a verifiably registered mbean [" + objectName + + "]", e); + } catch (MBeanRegistrationException e) { + addError("Failed to unregister [" + objectName + "]", e); + } + } else { + addInfo("mbean [" + objectName + + "] was not in the mbean registry. This is OK."); + } + + } + + public void onStart(LoggerContext context) { + } + + @Override + public String toString() { + return this.getClass().getName() + "(" + context.getName() + ")"; + } } Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfiguratorMBean.java (from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java) ============================================================================== --- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfiguratorMBean.java Tue Nov 4 20:23:14 2008 @@ -9,18 +9,19 @@ */ package ch.qos.logback.classic.jmx; +import java.io.FileNotFoundException; import java.net.URL; import java.util.List; import ch.qos.logback.core.joran.spi.JoranException; -public interface ConfiguratorMBean { +public interface JMXConfiguratorMBean { - public void reload(); + public void reloadDefaultConfiguration() throws JoranException; - public void reload(String fileName) throws JoranException; + public void reloadByFileName(String fileName) throws JoranException, FileNotFoundException; - public void reload(URL url) throws JoranException; + public void reloadByURL(URL url) throws JoranException; public void setLoggerLevel(String loggerName, String levelStr); Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/MBeanUtil.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/MBeanUtil.java Tue Nov 4 20:23:14 2008 @@ -0,0 +1,96 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.classic.jmx; + +import java.lang.management.ManagementFactory; + +import javax.management.InstanceNotFoundException; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.core.Context; +import ch.qos.logback.core.status.StatusUtil; + +public class MBeanUtil { + + static final String DOMAIN = "ch.qos.logback.classic"; + + static public String getObjectNameFor(Context context, Class type) { + String objectNameAsStr = DOMAIN + ":Name=" + context.getName() + ",Type=" + + type.getName(); + return objectNameAsStr; + } + + public static ObjectName string2ObjectName(Context context, Object caller, + String objectNameAsStr) { + String msg = "Failed to convert [" + objectNameAsStr + "] to ObjectName"; + + try { + return new ObjectName(objectNameAsStr); + } catch (MalformedObjectNameException e) { + StatusUtil.addError(context, caller, msg, e); + return null; + } catch (NullPointerException e) { + StatusUtil.addError(context, caller, msg, e); + return null; + } + } + + public static JMXConfigurator register(LoggerContext loggerContext, + ObjectName objectName, Object caller) { + try { + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + + JMXConfigurator jmxConfigurator = new JMXConfigurator(loggerContext, + mbs, objectName); + + if (mbs.isRegistered(objectName)) { + StatusUtil.addWarn(loggerContext, caller, + "Unregistering existing MBean named [" + + objectName.getCanonicalName() + "]"); + mbs.unregisterMBean(objectName); + } + mbs.registerMBean(jmxConfigurator, objectName); + return jmxConfigurator; + } catch (Exception e) { + StatusUtil.addError(loggerContext, caller, "Failed to create mbean", e); + return null; + } + } + + + + + + + public static void unregister(LoggerContext loggerContext, MBeanServer mbs, + ObjectName objectName, Object caller) { + if (mbs.isRegistered(objectName)) { + try { + StatusUtil.addInfo(loggerContext, caller, "Unregistering mbean [" + + objectName + "]"); + mbs.unregisterMBean(objectName); + } catch (InstanceNotFoundException e) { + // this is theoretically impossible + e.printStackTrace(); + } catch (MBeanRegistrationException e) { + // this also is theoretically impossible + e.printStackTrace(); + } + } else { + StatusUtil.addInfo(loggerContext, caller, "mbean [" + objectName + + "] does not seem to be registered"); + } + } + +} Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java Tue Nov 4 20:23:14 2008 @@ -1,51 +1,48 @@ package ch.qos.logback.classic.joran.action; -import java.lang.management.ManagementFactory; - -import javax.management.MBeanServer; import javax.management.ObjectName; import org.xml.sax.Attributes; import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.jmx.Configurator; -import ch.qos.logback.classic.jmx.ConfiguratorMBean; +import ch.qos.logback.classic.jmx.JMXConfigurator; +import ch.qos.logback.classic.jmx.MBeanUtil; import ch.qos.logback.core.joran.action.Action; import ch.qos.logback.core.joran.spi.ActionException; import ch.qos.logback.core.joran.spi.InterpretationContext; +import ch.qos.logback.core.util.OptionHelper; public class JMXConfiguratorAction extends Action { - static final String DOMAIN = "ch.qos.logback.classic"; - + static String OBJECT_NAME_ATTRIBUTE_NAME = "objectName"; + @Override public void begin(InterpretationContext ec, String name, Attributes attributes) throws ActionException { - register(); - } + addInfo("begin"); - @Override - public void end(InterpretationContext ec, String name) throws ActionException { + String objectNameAsStr; + String objectNameAttributeVal = attributes + .getValue(OBJECT_NAME_ATTRIBUTE_NAME); + if (OptionHelper.isEmpty(objectNameAttributeVal)) { + objectNameAsStr = MBeanUtil.getObjectNameFor((LoggerContext) context, + JMXConfigurator.class); + } else { + objectNameAsStr = objectNameAttributeVal; + } + + ObjectName objectName = MBeanUtil.string2ObjectName(context, this, + objectNameAsStr); + + if (objectName == null) { + MBeanUtil.register((LoggerContext) context, objectName, this); + } } - public void register() { - ConfiguratorMBean configuratorMBean = new Configurator((LoggerContext) context); + @Override + public void end(InterpretationContext ec, String name) throws ActionException { - MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - try { - ObjectName on = new ObjectName(DOMAIN + ":Name=" + context.getName() - + ",Type=" + configuratorMBean.getClass().getName()); - - // StandardMBean mbean = new StandardMBean(configuratorMBean, - // ConfiguratorMBean.class); - if (mbs.isRegistered(on)) { - mbs.unregisterMBean(on); - } - mbs.registerMBean(configuratorMBean, on); - } catch (Exception e) { - addError("Failed to create mbean", e); - } } } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java Tue Nov 4 20:23:14 2008 @@ -160,7 +160,7 @@ static public void configureLC(LoggerContext lc, String configFile) throws JoranException { JoranConfigurator configurator = new JoranConfigurator(); - lc.shutdownAndReset(); + lc.reset(); configurator.setContext(lc); configurator.doConfigure(configFile); } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java Tue Nov 4 20:23:14 2008 @@ -119,7 +119,7 @@ if (url != null) { try { JoranConfigurator configurator = new JoranConfigurator(); - context.shutdownAndReset(); + context.reset(); configurator.setContext(context); configurator.doConfigure(url); } catch (JoranException e) { Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java Tue Nov 4 20:23:14 2008 @@ -43,7 +43,7 @@ if (context != null) { Logger logger = context.getLogger(LoggerContext.ROOT_NAME); logger.warn("Shutting down context " + loggerContextName); - context.shutdownAndReset(); + context.reset(); } else { System.out.println("No context named " + loggerContextName + " was found."); } Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextListener.java (from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ContextListener.java) ============================================================================== --- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ContextListener.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextListener.java Tue Nov 4 20:23:14 2008 @@ -1,8 +1,17 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ package ch.qos.logback.classic.spi; import ch.qos.logback.classic.LoggerContext; -public interface ContextListener { +public interface LoggerContextListener { public void onReset(LoggerContext context); public void onStart(LoggerContext context); Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java Tue Nov 4 20:23:14 2008 @@ -33,8 +33,7 @@ this.loggerContext = loggerContext; } - public void configureByResource(URL url) - throws JoranException { + public void configureByResource(URL url) throws JoranException { if (url == null) { throw new IllegalArgumentException("URL argument cannot be null"); } @@ -43,7 +42,7 @@ configurator.doConfigure(url); } - private URL findConfigFileURLFromSystemProperties() { + private URL findConfigFileURLFromSystemProperties(boolean updateStatus) { String logbackConfigFile = System.getProperty(CONFIG_FILE_PROPERTY, null); if (logbackConfigFile != null) { URL result = null; @@ -66,24 +65,38 @@ } } } finally { - statusOnResourceSearch(logbackConfigFile, result); + if (updateStatus) { + statusOnResourceSearch(logbackConfigFile, result); + } } } return null; } - public void autoConfig() throws JoranException { - StatusListenerConfigHelper.installIfAsked(loggerContext); + public URL findURLOfDefaultConfigurationFile(boolean updateStatus) { + URL url = findConfigFileURLFromSystemProperties(updateStatus); + if (url != null) { + return url; + } - URL url = findConfigFileURLFromSystemProperties(); - if (url == null) { - url = Loader.getResourceBySelfClassLoader(TEST_AUTOCONFIG_FILE); + url = Loader.getResourceBySelfClassLoader(TEST_AUTOCONFIG_FILE); + if (updateStatus) { statusOnResourceSearch(TEST_AUTOCONFIG_FILE, url); } - if (url == null) { - url = Loader.getResourceBySelfClassLoader(AUTOCONFIG_FILE); + if (url != null) { + return url; + } + + url = Loader.getResourceBySelfClassLoader(AUTOCONFIG_FILE); + if (updateStatus) { statusOnResourceSearch(AUTOCONFIG_FILE, url); } + return url; + } + + public void autoConfig() throws JoranException { + StatusListenerConfigHelper.installIfAsked(loggerContext); + URL url = findURLOfDefaultConfigurationFile(true); if (url != null) { configureByResource(url); } else { Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java Tue Nov 4 20:23:14 2008 @@ -23,9 +23,9 @@ suite.addTest(ch.qos.logback.classic.util.PackageTest.suite()); suite.addTest(ch.qos.logback.classic.control.PackageTest.suite()); suite.addTest(ch.qos.logback.classic.joran.PackageTest.suite()); + suite.addTest(ch.qos.logback.classic.jmx.PackageTest.suite()); suite.addTest(ch.qos.logback.classic.boolex.PackageTest.suite()); suite.addTest(ch.qos.logback.classic.selector.PackageTest.suite()); - suite.addTest(ch.qos.logback.classic.html.PackageTest.suite()); suite.addTest(ch.qos.logback.classic.net.PackageTest.suite()); suite.addTest(ch.qos.logback.classic.pattern.PackageTest.suite()); Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java Tue Nov 4 20:23:14 2008 @@ -134,7 +134,7 @@ public void testLoggingContextShutdownAndReset() { addYesFilter(); assertNotNull(context.getTurboFilterList().get(0)); - context.shutdownAndReset(); + context.reset(); assertEquals(0, context.getTurboFilterList().size()); } Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java Tue Nov 4 20:23:14 2008 @@ -0,0 +1,86 @@ +package ch.qos.logback.classic.jmx; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.lang.management.ManagementFactory; +import java.util.List; + +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggerContextListener; +import ch.qos.logback.core.testUtil.RandomUtil; +import ch.qos.logback.core.util.StatusPrinter; + +public class JMXConfiguratorTest { + + static MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + LoggerContext lc = new LoggerContext(); + List<LoggerContextListener> listenerList; + int diff = RandomUtil.getPositiveInt(); + + @Before + public void setUp() throws Exception { + lc.setName("context-" + diff); + } + + @After + public void tearDown() throws Exception { + lc.reset(); + } + + @Override + public String toString() { + return this.getClass().getName() + "(" + lc.getName() + ")"; + } + + @Test + public void contextListening() { + String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName() + + ",Type=" + this.getClass().getName(); + ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr); + + MBeanUtil.register(lc, on, this); + listenerList = lc.getCopyOfListenerList(); + assertEquals(1, listenerList.size()); + lc.reset(); + listenerList = lc.getCopyOfListenerList(); + assertEquals(0, listenerList.size()); + + MBeanUtil.register(lc, on, this); + listenerList = lc.getCopyOfListenerList(); + assertEquals(1, listenerList.size()); + + } + + @Test + public void testRemovalOfPreviousIntanceFromTheContextListenerList() { + String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName() + + ",Type=" + this.getClass().getName(); + + ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr); + JMXConfigurator jmxConfigurator0 = MBeanUtil.register(lc, on, this); + + listenerList = lc.getCopyOfListenerList(); + assertEquals(1, listenerList.size()); + assertTrue(listenerList.contains(jmxConfigurator0)); + + JMXConfigurator jmxConfigurator1 = MBeanUtil.register(lc, on, this); + listenerList = lc.getCopyOfListenerList(); + assertEquals(1, listenerList.size()); + assertFalse("old configurator should be absent", listenerList.contains(jmxConfigurator0)); + assertTrue("new configurator should be present", listenerList.contains(jmxConfigurator1)); + + StatusPrinter.print(lc); + + } + +} Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/PackageTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/PackageTest.java Tue Nov 4 20:23:14 2008 @@ -0,0 +1,25 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.classic.jmx; + + +import junit.framework.JUnit4TestAdapter; +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +public class PackageTest extends TestCase { + + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.addTest(new JUnit4TestAdapter (JMXConfiguratorTest.class)); + return suite; + } +} \ No newline at end of file Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java Tue Nov 4 20:23:14 2008 @@ -11,7 +11,7 @@ public static void main(String[] args) { Logger logger = (Logger)LoggerFactory.getLogger(JMSTopicAppenderTestApp.class); LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - lc.shutdownAndReset(); + lc.reset(); JMSQueueAppender appender = new JMSQueueAppender(); appender.setContext(lc); Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java Tue Nov 4 20:23:14 2008 @@ -11,7 +11,7 @@ public static void main(String[] args) { Logger logger = (Logger)LoggerFactory.getLogger(JMSTopicAppenderTestApp.class); LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - lc.shutdownAndReset(); + lc.reset(); JMSTopicAppender appender = new JMSTopicAppender(); appender.setContext(lc); Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java Tue Nov 4 20:23:14 2008 @@ -141,7 +141,7 @@ JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); - lc.shutdownAndReset(); + lc.reset(); configurator.doConfigure(TestConstants.JORAN_ONPUT_PREFIX + "/syslog_LBCLASSIC_50.xml"); Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicContextListener.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicContextListener.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicContextListener.java Tue Nov 4 20:23:14 2008 @@ -2,7 +2,7 @@ import ch.qos.logback.classic.LoggerContext; -public class BasicContextListener implements ContextListener { +public class BasicContextListener implements LoggerContextListener { boolean updated = false; LoggerContext context; Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ContextListenerTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ContextListenerTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ContextListenerTest.java Tue Nov 4 20:23:14 2008 @@ -16,7 +16,7 @@ } public void testNotifyOnReset() { - context.shutdownAndReset(); + context.reset(); assertTrue(listener.updated); assertEquals(listener.context, context); } Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationTest.java Tue Nov 4 20:23:14 2008 @@ -46,7 +46,7 @@ public void tearDown() throws Exception { System.clearProperty(ContextInitializer.CONFIG_FILE_PROPERTY); System.clearProperty(ContextInitializer.STATUS_LISTENER_CLASS); - lc.shutdownAndReset(); + lc.reset(); } @Test @@ -73,7 +73,7 @@ assertTrue(appender instanceof ConsoleAppender); } { - lc.shutdownAndReset(); + lc.reset(); Appender appender = root.getAppender("STDOUT"); assertNull(appender); } Modified: logback/trunk/logback-classic/src/test/java/org/dummy/Log4jInvocation.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/org/dummy/Log4jInvocation.java (original) +++ logback/trunk/logback-classic/src/test/java/org/dummy/Log4jInvocation.java Tue Nov 4 20:23:14 2008 @@ -23,7 +23,7 @@ @Before public void fixture() { lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - lc.shutdownAndReset(); + lc.reset(); listAppender = new DummyLBAppender(); listAppender.setContext(lc); Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusListenerAsList.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusListenerAsList.java Tue Nov 4 20:23:14 2008 @@ -0,0 +1,34 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.core.status; + +import java.util.ArrayList; +import java.util.List; + +/** + * Collect all incoming events in a list. + * + * @author Ceki Gülcü + * + */ +public class StatusListenerAsList implements StatusListener { + + List<Status> statusList = new ArrayList<Status>(); + + public void addStatusEvent(Status status) { + statusList.add(status); + } + + public List<Status> getStatusList() { + return statusList; + } + + +} Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusUtil.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusUtil.java Tue Nov 4 20:23:14 2008 @@ -0,0 +1,38 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.core.status; + +import ch.qos.logback.core.Context; + +public class StatusUtil { + + static public void addStatus(Context context, Status status) { + if (context == null) { + return; + } + StatusManager sm = context.getStatusManager(); + if (sm != null) { + sm.add(status); + } + } + + static public void addInfo(Context context, Object caller, String msg) { + addStatus(context, new InfoStatus(msg, caller)); + } + + static public void addWarn(Context context, Object caller, String msg) { + addStatus(context, new WarnStatus(msg, caller)); + } + + static public void addError(Context context, Object caller, String msg, + Throwable t) { + addStatus(context, new ErrorStatus(msg, caller, t)); + } +} Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java Tue Nov 4 20:23:14 2008 @@ -14,14 +14,15 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; +import java.util.List; import ch.qos.logback.core.Context; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.Layout; +import ch.qos.logback.core.helpers.ThrowableToStringArray; import ch.qos.logback.core.status.ErrorStatus; import ch.qos.logback.core.status.Status; import ch.qos.logback.core.status.StatusManager; -import ch.qos.logback.core.helpers.ThrowableToStringArray; public class StatusPrinter { @@ -35,8 +36,8 @@ } /** - * Print the contents of the context statuses, but only if they - * contain errors. + * Print the contents of the context statuses, but only if they contain + * errors. * * @param context */ @@ -78,18 +79,29 @@ public static void print(StatusManager sm) { StringBuilder sb = new StringBuilder(); - buildStr(sb, sm); + buildStrFromStatusManager(sb, sm); ps.println(sb.toString()); } - public static void buildStr(StringBuilder sb, StatusManager sm) { - Iterator it = sm.getCopyOfStatusList().iterator(); + public static void print(List<Status> statusList) { + StringBuilder sb = new StringBuilder(); + buildStrFromStatusList(sb, statusList); + ps.println(sb.toString()); + } + + + private static void buildStrFromStatusList(StringBuilder sb, List<Status> statusList) { + Iterator it = statusList.iterator(); while (it.hasNext()) { Status s = (Status) it.next(); buildStr(sb, "", s); } } + private static void buildStrFromStatusManager(StringBuilder sb, StatusManager sm) { + buildStrFromStatusList(sb, sm.getCopyOfStatusList()); + } + private static void appendThrowable(StringBuilder sb, Throwable t) { String[] stringRep = ThrowableToStringArray.convert(t); Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/RandomUtil.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/RandomUtil.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/RandomUtil.java Tue Nov 4 20:23:14 2008 @@ -21,4 +21,11 @@ return r + 1024; } + public static int getPositiveInt() { + int r = random.nextInt(); + if (r < 0) { + r = -r; + } + return r; + } } Modified: logback/trunk/logback-examples/src/main/java/chapter2/MyAppWithConfigFile.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter2/MyAppWithConfigFile.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter2/MyAppWithConfigFile.java Tue Nov 4 20:23:14 2008 @@ -26,7 +26,7 @@ try { JoranConfigurator configurator = new JoranConfigurator(); - lc.shutdownAndReset(); + lc.reset(); configurator.setContext(lc); configurator.doConfigure(args[0]); } catch (JoranException je) { Modified: logback/trunk/logback-examples/src/main/java/chapter3/MyApp3.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter3/MyApp3.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter3/MyApp3.java Tue Nov 4 20:23:14 2008 @@ -33,7 +33,7 @@ configurator.setContext(lc); // the context was probably already configured by default configuration // rules - lc.shutdownAndReset(); + lc.reset(); configurator.doConfigure(args[0]); } catch (JoranException je) { je.printStackTrace(); Modified: logback/trunk/logback-examples/src/main/java/chapter4/ConfigurationTester.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter4/ConfigurationTester.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter4/ConfigurationTester.java Tue Nov 4 20:23:14 2008 @@ -41,7 +41,7 @@ try { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); - lc.shutdownAndReset(); + lc.reset(); configurator.doConfigure(args[0]); } catch (JoranException je) { je.printStackTrace(); Modified: logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes1.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes1.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes1.java Tue Nov 4 20:23:14 2008 @@ -25,7 +25,7 @@ public static void main(String[] args) throws Exception { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - lc.shutdownAndReset(); // we want to override the default-config. + lc.reset(); // we want to override the default-config. WriterAppender<LoggingEvent> writerAppender = new WriterAppender<LoggingEvent>(); writerAppender.setContext(lc); writerAppender.setLayout(new EchoLayout<LoggingEvent>()); Modified: logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes2.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes2.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes2.java Tue Nov 4 20:23:14 2008 @@ -26,7 +26,7 @@ public static void main(String[] args) throws Exception { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - lc.shutdownAndReset();//this is to cancel default-config. + lc.reset();//this is to cancel default-config. WriterAppender<LoggingEvent> writerAppender = new WriterAppender<LoggingEvent>(); writerAppender.setContext(lc); writerAppender.setLayout(new EchoLayout<LoggingEvent>()); @@ -42,7 +42,7 @@ logger.debug("Hello world."); - lc.shutdownAndReset(); + lc.reset(); StatusPrinter.print(lc); } Modified: logback/trunk/logback-examples/src/main/java/chapter4/mail/EMail.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter4/mail/EMail.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter4/mail/EMail.java Tue Nov 4 20:23:14 2008 @@ -35,7 +35,7 @@ LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); JoranConfigurator configurator = new JoranConfigurator(); - lc.shutdownAndReset(); + lc.reset(); configurator.setContext(lc); configurator.doConfigure(configFile); StatusPrinter.printIfErrorsOccured(lc); Modified: logback/trunk/logback-examples/src/main/java/chapter4/socket/SocketClient2.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter4/socket/SocketClient2.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter4/socket/SocketClient2.java Tue Nov 4 20:23:14 2008 @@ -45,7 +45,7 @@ if (configFile.endsWith(".xml")) { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); JoranConfigurator configurator = new JoranConfigurator(); - lc.shutdownAndReset(); + lc.reset(); configurator.setContext(lc); configurator.doConfigure(configFile); } Modified: logback/trunk/logback-examples/src/main/java/chapter5/CallerEvaluatorExample.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter5/CallerEvaluatorExample.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter5/CallerEvaluatorExample.java Tue Nov 4 20:23:14 2008 @@ -18,7 +18,7 @@ try { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); - lc.shutdownAndReset(); + lc.reset(); configurator.doConfigure(args[0]); } catch (JoranException je) { StatusPrinter.print(lc); Modified: logback/trunk/logback-examples/src/main/java/chapter5/ExceptionEvaluatorExample.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter5/ExceptionEvaluatorExample.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter5/ExceptionEvaluatorExample.java Tue Nov 4 20:23:14 2008 @@ -17,7 +17,7 @@ try { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); - lc.shutdownAndReset(); + lc.reset(); configurator.doConfigure(args[0]); } catch (JoranException je) { StatusPrinter.print(lc); Modified: logback/trunk/logback-examples/src/main/java/chapter5/GoMDC.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter5/GoMDC.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter5/GoMDC.java Tue Nov 4 20:23:14 2008 @@ -19,7 +19,7 @@ try { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); - lc.shutdownAndReset(); + lc.reset(); configurator.doConfigure("mdcFilter.xml"); } catch (JoranException je) { Modified: logback/trunk/logback-examples/src/main/java/chapter5/SampleLogging.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter5/SampleLogging.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter5/SampleLogging.java Tue Nov 4 20:23:14 2008 @@ -17,7 +17,7 @@ try { JoranConfigurator configurator = new JoranConfigurator(); - lc.shutdownAndReset(); + lc.reset(); configurator.setContext(lc); configurator.doConfigure(args[0]); } catch (JoranException je) { Modified: logback/trunk/logback-examples/src/main/java/chapter6/FilterEvents.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter6/FilterEvents.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter6/FilterEvents.java Tue Nov 4 20:23:14 2008 @@ -24,7 +24,7 @@ try { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); - lc.shutdownAndReset(); + lc.reset(); configurator.doConfigure(args[0]); } catch (JoranException je) { je.printStackTrace(); Modified: logback/trunk/logback-examples/src/main/java/chapter7/NumberCruncherServer.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter7/NumberCruncherServer.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter7/NumberCruncherServer.java Tue Nov 4 20:23:14 2008 @@ -134,7 +134,7 @@ LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); - lc.shutdownAndReset(); + lc.reset(); configurator.doConfigure(args[0]); } catch (JoranException je) { je.printStackTrace(); Modified: logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java Tue Nov 4 20:23:14 2008 @@ -59,7 +59,7 @@ // Configure logback LoggerContext loggerContext = (LoggerContext) LoggerFactory .getILoggerFactory(); - loggerContext.shutdownAndReset(); + loggerContext.reset(); PatternLayout layout = new PatternLayout(); layout.setContext(loggerContext); layout.setPattern("%X{first} %X{last} - %m%n"); @@ -80,7 +80,7 @@ try { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); - lc.shutdownAndReset(); + lc.reset(); URL url = Loader.getResourceBySelfClassLoader("chapter7/simpleMDC.xml"); configurator.doConfigure(url); } catch (JoranException je) {

Regarding revision 1945, I should have commented that the resetAndShutdown() method in LoggerContext was deprecated and replaced by reset(). I intend to further modify the LoggerContext so that when the stop() method of a LoggerContext is called, then that LoggerContext will become unmodifiable. This should be helpful in the diagnosis of problems associated with supposedly discarded (and closed) logger contexts which linger for various reasons. (However, this change by itself it will not solve"lingering context" problems.) noreply.ceki@qos.ch wrote:
Author: ceki Date: Tue Nov 4 20:23:14 2008 New Revision: 1945 [snip]
Log:
This commit is related to:
LBCLASSIC-61 (configurable ObjectName) LBCLASSIC-24 (better error messages after reload) LBCLASSIC-33 (JMX configurator unregisters itself)
- Refactoring of LoggerContext class so it has a cleaner lifecycle - Major refactorization of c.q.l.c.jmx.Configurator (renamed as JMXConfigurator) in order to fix the aforementioned bugs
More updates to follow
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java ============================================================================== [snip]
-- Ceki Gülcü Logback: The reliable, generic, fast and flexible logging framework for Java. http://logback.qos.ch
participants (2)
-
Ceki Gulcu
-
noreply.ceki@qos.ch