The promised patches are included as attachments.
Please also note the page http://qos.ch/containers/sc.html moved to http://qos.ch/logging/sc.html
At 16:08 15.02.2003 +0100, you wrote:
Hi Jake,
Nothing prevents you from instantiating a ContextClassLoaderSelector instance in InitContextListener. I'll supply the patch in the next few minutes.
At 11:03 14.02.2003 -0600, you wrote:
Hello Ceki, No, I haven't as of yet. I'll try that this weekend.BTW, before you mentioned that doIdempotentInitialization() should be moved from the ContextClassLoaderSelector to whatever code that is performing initializatiion, such as the InitContextListener. However, I don't see how this is possible given the contents of the initialization method... public static void doIdempotentInitialization() { if (!initialized) { try { Object guard = new Object(); LogManager.setRepositorySelector(SINGLETON, guard); initialized = true; } catch (IllegalArgumentException iae) { // either ignore the exception or log the fact that the // setting of this custom repository selector failed because // another had been set previously and maybe we should set // "initialized" to "true" in here so this exception doesn't // occur again in this class } } } Note the "SINGLETON" variable sent into setRepositorySelector. This is a private variable that is the singleton instance of the ContextClassLoader... /** * singleton instance for this class */ private static final ContextClassLoaderSelector SINGLETON = new ContextClassLoaderSelector();-- Ceki
Index: InitContextListener.java =================================================================== RCS file: /home/cvs/jakarta-log4j-sandbox/src/java/org/apache/log4j/servlet/InitContextListener.java,v retrieving revision 1.1 diff -u -u -r1.1 InitContextListener.java --- InitContextListener.java 4 Feb 2003 06:28:16 -0000 1.1 +++ InitContextListener.java 15 Feb 2003 15:28:48 -0000 @@ -19,6 +19,7 @@ import org.apache.log4j.helpers.LogLog; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.xml.DOMConfigurator; +import org.apache.log4j.LogManager; import org.apache.log4j.selector.ContextClassLoaderSelector; @@ -153,6 +154,8 @@ // store the time at which the current application became fully initialized public static long applicationInitialized = 0L; + private static boolean selectorSet = false; + private final static String PARAM_LOG4J_CONFIG_PATH = "log4j-config"; private final static String PARAM_LOG4J_WATCH_INTERVAL = "log4j-cron"; private final static String PARAM_LOG4J_LOG_HOME = "log4j-log-home"; @@ -167,7 +170,7 @@ ServletContext context = sce.getServletContext(); - initializeLog4j(context); + initializeLog4j(context); } /** @@ -236,7 +239,7 @@ } catch (NumberFormatException nfe) {} } - initLoggerRepository(); + setSelector(); context.log("Configuring Log4j from File: "+contextPath+systemConfigPath); if (timerIntervalVal > 0) { context.log("Configuring Log4j with watch interval: "+timerIntervalVal+"ms"); @@ -274,7 +277,7 @@ } catch (MalformedURLException murle) {} if (log4jURL!=null) { - initLoggerRepository(); + setSelector(); context.log("Configuring Log4j from URL at path: /"+configPath); if (isXMLConfigFile) { try { @@ -334,7 +337,20 @@ } } - private void initLoggerRepository() { - ContextClassLoaderSelector.doIdempotentInitialization(); + public static void setSelector() { + if (!selectorSet) { + try { + Object guard = new Object(); + ContextClassLoaderSelector crs = new ContextClassLoaderSelector(); + LogManager.setRepositorySelector(crs, guard); + selectorSet = true; + } catch (IllegalArgumentException iae) { + // either ignore the exception or log the fact that the + // setting of this custom repository selector failed because + // another had been set previously and maybe we should set + // "initialized" to "true" in here so this exception doesn't + // occur again in this class + } } + } } Index: InitServlet.java =================================================================== RCS file: /home/cvs/jakarta-log4j-sandbox/src/java/org/apache/log4j/servlet/InitServlet.java,v retrieving revision 1.1 diff -u -u -r1.1 InitServlet.java --- InitServlet.java 4 Feb 2003 06:28:16 -0000 1.1 +++ InitServlet.java 15 Feb 2003 15:28:49 -0000 @@ -22,6 +22,7 @@ import org.apache.log4j.helpers.LogLog; import org.apache.log4j.PropertyConfigurator; +import org.apache.log4j.LogManager; import org.apache.log4j.xml.DOMConfigurator; import org.apache.log4j.selector.ContextClassLoaderSelector; @@ -77,6 +78,8 @@ private static Boolean CONFIGURED = Boolean.FALSE; + private boolean selectorSet = false; + public void init() throws ServletException { if (CONFIGURED.equals(Boolean.FALSE)) { String configPath = getInitParameter(PARAM_LOG4J_CONFIG_PATH); @@ -228,7 +231,15 @@ } private void initLoggerRepository() { - ContextClassLoaderSelector.doIdempotentInitialization(); + if (!selectorSet) { + try { + Object guard = new Object(); + ContextClassLoaderSelector crs = new ContextClassLoaderSelector(); + LogManager.setRepositorySelector(crs, guard); + selectorSet = true; + } catch (IllegalArgumentException iae) { + } + } } /**
Index: ContextClassLoaderSelector.java =================================================================== RCS file: /home/cvs/jakarta-log4j-sandbox/src/java/org/apache/log4j/selector/ContextClassLoaderSelector.java,v retrieving revision 1.2 diff -u -u -r1.2 ContextClassLoaderSelector.java --- ContextClassLoaderSelector.java 14 Feb 2003 05:58:56 -0000 1.2 +++ ContextClassLoaderSelector.java 15 Feb 2003 15:28:08 -0000 @@ -58,22 +58,7 @@ private static final Map HIER_MAP = Collections.synchronizedMap(new WeakHashMap()); - /** - * singleton instance for this class - */ - private static final ContextClassLoaderSelector SINGLETON = - new ContextClassLoaderSelector(); - - /** - * remember idempotent initialization status - */ - private static boolean initialized = false; - - /** - * private no-args constructor to guarantee no outside code can create an - * instance - */ - private ContextClassLoaderSelector() { + public ContextClassLoaderSelector() { } /** @@ -93,24 +78,4 @@ return hierarchy; } - /** - * The Container should initialize the logger repository for each - * webapp upon startup or reload. In this case, it is controllable - * via each webapp. - */ - public static void doIdempotentInitialization() { - if (!initialized) { - try { - Object guard = new Object(); - LogManager.setRepositorySelector(SINGLETON, guard); - initialized = true; - } catch (IllegalArgumentException iae) { - // either ignore the exception or log the fact that the - // setting of this custom repository selector failed because - // another had been set previously and maybe we should set - // "initialized" to "true" in here so this exception doesn't - // occur again in this class - } - } - } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]