
Author: ceki Date: Fri Nov 28 21:34:30 2008 New Revision: 2034 Added: logback/trunk/logback-site/src/site/pages/manual/.htaccess logback/trunk/logback-site/src/site/pages/manual/loggingSeparation.html Modified: logback/trunk/logback-classic/pom.xml logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java logback/trunk/logback-classic/src/test/java/org/slf4j/impl/RecursiveInitializationTest.java logback/trunk/logback-classic/src/test/resources/autoConfigAsResource.xml logback/trunk/logback-site/src/site/pages/download.html logback/trunk/logback-site/src/site/pages/manual/index.html logback/trunk/logback-site/src/site/pages/manual/menu.js logback/trunk/logback-site/src/site/pages/news.html logback/trunk/pom.xml Log: - rewrote the "contextSelector.html" chapter. The chapter was renamed as "loggingSeparation.html" - logback now uses slf4j version 1.5.6 - ContextJNDISelector was refactored. The config file name for a new logger context is based on convention "logback-CONTEXTNAME.xml" This obviates the need to set the "logback/configuration-resource" JNDI env-entry. Modified: logback/trunk/logback-classic/pom.xml ============================================================================== --- logback/trunk/logback-classic/pom.xml (original) +++ logback/trunk/logback-classic/pom.xml Fri Nov 28 21:34:30 2008 @@ -48,7 +48,6 @@ <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-ext</artifactId> - <version>${slf4j.version}</version> <scope>compile</scope> </dependency> 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 Fri Nov 28 21:34:30 2008 @@ -22,13 +22,14 @@ import javax.naming.Context; import javax.naming.NamingException; -import org.slf4j.Logger; - import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.classic.util.ContextInitializer; import ch.qos.logback.classic.util.JNDIUtil; import ch.qos.logback.core.joran.spi.JoranException; +import ch.qos.logback.core.status.InfoStatus; +import ch.qos.logback.core.status.StatusManager; +import ch.qos.logback.core.status.WarnStatus; import ch.qos.logback.core.util.Loader; import ch.qos.logback.core.util.StatusPrinter; @@ -56,6 +57,14 @@ defaultContext = context; } + public LoggerContext getDefaultLoggerContext() { + return defaultContext; + } + + public LoggerContext detachLoggerContext(String loggerContextName) { + return contextMap.remove(loggerContextName); + } + public LoggerContext getLoggerContext() { String contextName = null; Context ctx = null; @@ -87,49 +96,68 @@ loggerContext = new LoggerContext(); loggerContext.setName(contextName); contextMap.put(contextName, loggerContext); - - // Do we have a dedicated configuration file? - String configFilePath = JNDIUtil.lookup(ctx, - JNDI_CONFIGURATION_RESOURCE); - if (configFilePath != null) { - configureLoggerContextByResource(loggerContext, configFilePath); + URL url = findConfigFileURL(ctx, loggerContext); + if (url != null) { + configureLoggerContextByURL(loggerContext, url); } else { try { new ContextInitializer(loggerContext).autoConfig(); - } catch(JoranException je) { - StatusPrinter.print(loggerContext); + } catch (JoranException je) { } } + StatusPrinter.printIfErrorsOccured(loggerContext); } return loggerContext; } } - public LoggerContext getDefaultLoggerContext() { - return defaultContext; + private String conventionalConfigFileName(String contextName) { + return "logback-" + contextName + ".xml"; } - public LoggerContext detachLoggerContext(String loggerContextName) { - return contextMap.remove(loggerContextName); - } + private URL findConfigFileURL(Context ctx, LoggerContext loggerContext) { + StatusManager sm = loggerContext.getStatusManager(); - private void configureLoggerContextByResource(LoggerContext context, - String configFilePath) { - URL url = Loader.getResourceBySelfClassLoader(configFilePath); - if (url != null) { - try { - JoranConfigurator configurator = new JoranConfigurator(); - context.reset(); - configurator.setContext(context); - configurator.doConfigure(url); - } catch (JoranException e) { - StatusPrinter.print(context); + String jndiEntryForConfigResource = JNDIUtil.lookup(ctx, + JNDI_CONFIGURATION_RESOURCE); + // Do we have a dedicated configuration file? + if (jndiEntryForConfigResource != null) { + sm.add(new InfoStatus("Searching for [" + jndiEntryForConfigResource + + "]", this)); + URL url = urlByResourceName(sm, jndiEntryForConfigResource); + if (url == null) { + String msg = "The jndi resource [" + jndiEntryForConfigResource + + "] for context [" + loggerContext.getName() + + "] does not lead to a valid file"; + sm.add(new WarnStatus(msg, this)); } + return url; } else { - Logger logger = defaultContext.getLogger(LoggerContext.ROOT_NAME); - logger.warn("The provided URL for context" + context.getName() - + " does not lead to a valid file"); + String resourceByConvention = conventionalConfigFileName(loggerContext + .getName()); + return urlByResourceName(sm, resourceByConvention); + } + } + + private URL urlByResourceName(StatusManager sm, String resourceName) { + sm.add(new InfoStatus("Searching for [" + resourceName + "]", + this)); + URL url = Loader.getResource(resourceName, Loader.getTCL()); + if (url != null) { + return url; + } + return Loader.getResourceBySelfClassLoader(resourceName); + } + + private void configureLoggerContextByURL(LoggerContext context, URL url) { + try { + JoranConfigurator configurator = new JoranConfigurator(); + context.reset(); + configurator.setContext(context); + configurator.doConfigure(url); + } catch (JoranException e) { } + StatusPrinter.printIfErrorsOccured(context); } public List<String> getContextNames() { Modified: logback/trunk/logback-classic/src/test/java/org/slf4j/impl/RecursiveInitializationTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/org/slf4j/impl/RecursiveInitializationTest.java (original) +++ logback/trunk/logback-classic/src/test/java/org/slf4j/impl/RecursiveInitializationTest.java Fri Nov 28 21:34:30 2008 @@ -1,9 +1,7 @@ package org.slf4j.impl; -import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; -import java.util.List; import java.util.Random; import org.junit.After; @@ -17,7 +15,7 @@ import ch.qos.logback.classic.util.ContextInitializer; import ch.qos.logback.core.status.Status; import ch.qos.logback.core.status.StatusManager; - +import ch.qos.logback.core.util.StatusPrinter; public class RecursiveInitializationTest { @@ -27,7 +25,9 @@ public void setUp() throws Exception { System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "recursiveInit.xml"); + StaticLoggerBinderFriend.reset(); LoggerFactoryFriend.reset(); + } @After @@ -43,25 +43,9 @@ LoggerContext loggerContext = (LoggerContext) LoggerFactory .getILoggerFactory(); + StatusPrinter.printIfErrorsOccured(loggerContext); StatusManager sm = loggerContext.getStatusManager(); - - assertEquals("Was expecting no errors", Status.INFO, sm.getLevel()); - - List<Status> statusList = sm.getCopyOfStatusList(); -// int errorCount = 0; -// -// for(Status s: statusList) { -// if(s.getLevel() == Status.ERROR) { -// errorCount++; -// System.out.println("=========================="); -// System.out.println(s); -// System.out.println("=========================="); -// -// assertNull("Status ["+s+"] has a throwable", s.getThrowable()); -// } -// } - // Error msg: No appenders present in context [default] for logger [ResursiveLBAppender..]. -// assertEquals("Expecting only one error", 1, errorCount); - } + assertEquals("Was expecting no errors", Status.WARN, sm.getLevel()); + } } Modified: logback/trunk/logback-classic/src/test/resources/autoConfigAsResource.xml ============================================================================== --- logback/trunk/logback-classic/src/test/resources/autoConfigAsResource.xml (original) +++ logback/trunk/logback-classic/src/test/resources/autoConfigAsResource.xml Fri Nov 28 21:34:30 2008 @@ -2,15 +2,14 @@ <configuration> - <appender name="AUTO_BY_SYSTEM_PROPERTY" class="ch.qos.logback.core.ConsoleAppender"> - <layout class="ch.qos.logback.classic.PatternLayout"> - <pattern>%msg%n"</pattern> - </layout> - </appender> + <appender name="AUTO_BY_SYSTEM_PROPERTY" + class="ch.qos.logback.core.ConsoleAppender"> + <layout class="ch.qos.logback.classic.PatternLayout"> + <pattern>%msg%n"</pattern> + </layout> + </appender> - <root> - <level value="debug" /> - <appender-ref ref="AUTO_BY_SYSTEM_PROPERTY" /> - - </root> + <root level="debug"> + <appender-ref ref="AUTO_BY_SYSTEM_PROPERTY" /> + </root> </configuration> Modified: logback/trunk/logback-site/src/site/pages/download.html ============================================================================== --- logback/trunk/logback-site/src/site/pages/download.html (original) +++ logback/trunk/logback-site/src/site/pages/download.html Fri Nov 28 21:34:30 2008 @@ -27,7 +27,7 @@ <ul> <li><a href="dist/logback-${pom.version}.zip">logback-${pom.version}.zip</a></li> - <li><a href="dist/logback-${pom.version}.tar.gz">logback-${pom.version}.tar.gz</a></li> + <li><a href="dist/logback-${project.version}.tar.gz">logback-${pom.version}.tar.gz</a></li> </ul> Added: logback/trunk/logback-site/src/site/pages/manual/.htaccess ============================================================================== --- (empty file) +++ logback/trunk/logback-site/src/site/pages/manual/.htaccess Fri Nov 28 21:34:30 2008 @@ -0,0 +1 @@ +Redirect contextSelector.html loggingSeparation.html \ No newline at end of file Modified: logback/trunk/logback-site/src/site/pages/manual/index.html ============================================================================== --- logback/trunk/logback-site/src/site/pages/manual/index.html (original) +++ logback/trunk/logback-site/src/site/pages/manual/index.html Fri Nov 28 21:34:30 2008 @@ -101,7 +101,7 @@ </p></li> <li><p> - <a href="contextSelector.html"><b>Chapter 8: Context Selector</b></a> + <a href="loggingSeparation.html"><b>Chapter 8: Logging Separation</b></a> </p></li> <li><p> Added: logback/trunk/logback-site/src/site/pages/manual/loggingSeparation.html ============================================================================== --- (empty file) +++ logback/trunk/logback-site/src/site/pages/manual/loggingSeparation.html Fri Nov 28 21:34:30 2008 @@ -0,0 +1,290 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> + <title>Chapter 8: Context Selector</title> + <link rel="stylesheet" type="text/css" href="../css/common.css" /> + <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" /> + <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" /> + + </head> + <body> + <script type="text/javascript">prefix='../';</script> + <script src="../templates/header.js" type="text/javascript"></script> + <div id="left"> + <script src="../templates/left.js" type="text/javascript"></script> + </div> + <div id="right"> + <script src="menu.js" type="text/javascript"></script> + </div> + <div id="content"> + + <h2>Chapter 9: Context Selectors</h2> + + <div class="quote"> + <p><em>It is not knowledge, but the act of learning, not + possession but the act of getting there, which grants the greatest + enjoyment. When I have clarified and exhausted a subject, then I + turn away from it, in order to go into darkness again; the + never-satisfied man is so strange if he has completed a structure, + then it is not in order to dwell in it peacefully, but in order to + begin another. I imagine the world conqueror must feel thus, who, + after one kingdom is scarcely conquered, stretches out his arms + for others.</em></p> + + <p>—KARL FRIEDRICH GAUSS, Letter to Bolyai, 1808.</p> + + <p><em>Style, like sheer silk, too often hides eczema.</em></p> + + <p>—ALBERT CAMUS, <em>The Fall</em></p> + + </div> + + <script src="../templates/creative.js" type="text/javascript"></script> + <script src="../templates/setup.js" type="text/javascript"></script> + + <h2>The problem: Logging Separation</h2> + + <p>The chapter deals with a relatively difficult problem of + providing a separate logging environment for multiple applications + running on the same web or EJB container. In the remainder of this + chapter the term "application" will be used to refer either a + web-application or a J2EE application interchangeably. In a + separated logging environment, each application sees a distinct + logback environment, so that the logback configuration of one + application does not interfere with the settings of another. In + more technical terms, each web-application has a distinct copy of + <code>LoggerContext</code> reserved for its own use. Recall that + in logback, each logger object is manufactured by a + <code>LoggerContext</code> to which it remains attached for as + long as the logger object lives in memory. A variant of this + problem is the separation of application logging and the logging + of the container itself. + </p> + + <h2>The simplest and easiest approach</h2> + + <p>Assuming your container supports child first class loading, + separation of logging can be accomplished by embedding a copy of + slf4j and logback jar files in each of your applications. For + web-applications, placing slf4j and logback jar files under the + <em>WEB-INF/lib</em> directory of the web-application is + sufficient to endow each web-application with a separate logging + environment. A copy of the <em>logback.xml</em> configuration file + placed under <em>WEB-INF/classes</em> will be picked up when + logback is loaded into memory. + </p> + + <p>By virtue of class loader separation provided by the container, + each web-application will load its own copy of + <code>LoggerContext</code> which will pickup its own copy of + <em>logback.xml</em>.</p> + + <p>Easy as pie.</p> + + <p>Well, not exactly. First, although most do, not all containers + support child first class loading. Second, logging generated by + shared libraries will not be separated. The common idiom for + referencing a logger is via a static reference. For example, + </p> + + <p class="source">public class Foo { + <b>static</b> Logger logger = LoggerFactory.getLogger(Foo.class); + ... +}</p> + + <p>Static references are both memory and CPU efficient. Only one + logger reference is used for all instances of the class. Moreover, + the logger instance is retrieved only once, when the class is + loaded into memory. Static logger references are fine as long as + they are used in classes loaded by different class + loaders. However, when a class is loaded by a parent class loader + common to multiple applications, then the shared class in question + will be loaded once and for all applications. If the shared class + contains a static logger reference, than the logger will be + retrieved once, when the shared class is loaded into memory and + initialized. Moreover, for the shared class to successfully load + into memory, slf4j and logback classed must be resolvable by the + parent class loader. This implies that slf4j and logback jar + files must also be accessible to the parent class loader. Note + that for this scenario to occur a class must be shared + <em>and</em> use slf4j, which is somewhat uncommon. + </p> + + <p>However, if the container itself uses SLF4J and defaults to + parent-first class loading, then you need context selectors. Read + on. + </p> + + <h2>Context Selectors</h2> + + + <p>Logback provides a mechanism for a single instance of SLF4J and + logback classes loaded into memory to provide multiple logger + contexts. When you write: + </p> + + <p class="source">Logger logger = LoggerFactory.getLogger("foo");</p> + + <p>the <code>getLogger</code>() method in + <code>LoggerFactory</code> class asks the SLF4J binding for a + <code>ILoggerFactory</code>. When SLF4J is bound to logback, the + task of returning an <code>ILoggerFactory</code> is delegated to + an instance of <a + href="../apidocs/ch/qos/logback/classic/selector/ContextSelector.html">ContextSelector</a>. Note + that <code>ContextSelector</code> implementations always return + instances of the <code>LoggerContext</code> class. This class + implements the <code>ILoggerFactory</code> interface. In other + words, a context selector has the option to returning any + <code>LoggerContext</code> instance it sees fit according to its + own criteria. Hence the name context <em>selector</em>. + </p> + + <p>By default, the logback binding uses <a + href="../xref/ch/qos/logback/classic/selector/DefaultContextSelector.html">DefaultContextSelector</a> + which always returns the same <code>LoggerContext</code>, called + the default logger context.</p> + + <p>You can specify a different context selector by setting the + <em>logback.ContextSelector</em> system property. Suppose you + would like to specify that context selector to an instance of the + <code>myPackage.myContextSelector</code> class, you would add the + following system property: </p> + + <p class="source">-Dlogback.ContextSelector=myPackage.myContextSelector</p> + + + <h3>ContextJNDISelector</h3> + + <p>Logback-classic ships with a selector called + <code>ContextJNDISelector</code> which selects the logger context + based on data available in JNDI. This leverages JNDI data + separation mandated by the J2EE specification. The same + environment variable can be set to carry a different value in each + application. + </p> + + <p>To enable <code>ContextJNDISelector</code>, the + <em>logback.ContextSelector</em> system property needs to be set + to "JNDI", as follows:</p> + + <p class="source">-Dlogback.ContextSelector=JNDI</p> + + <p>Note that JNDI is a convenient shorthand for + "ch.qos.logback.classic.selector.ContextJNDISelector".</p> + + <h3>Setting JNDI variables in applications</h3> + + <p>In each of your applications, you need to name the logging + context for the application. For a web-application, JNDI + environment entries are specified within the <em>web.xml</em> + file. If "kenobi" was the name of your application, you would add + the following XML element to kenobi's web.xml file:</p> + + <p class="source"><env-entry> + <env-entry-name>logback/context-name</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <env-entry-value>kenobi</env-entry-value> +</env-entry></p> + + <p>Assuming you have enabled <code>ContextJNDISelector</code>, + logging for Kenobi will be done using a logger context named + "kenobi". Moreover, the "kenobi" logger context will be + initialized by <em>convention</em> using the configuration file + called <em>logback-kenobi.xml</em> which should be packaged within + Kenobi web-application under the <em>WEB-INF/classes</em> folder. + </p> + + <p>Although not required, you may specify a different + configuration file other than the convention, by setting the + "logback/configuration-resource" JNDI variable. For example, if + you wish to specify <em>my_config.xml</em> instead of the + conventional <em>logback-kenobi.xml</em>, you would add the + following XML element to web.xml + </p> + + + <p class="source"><env-entry> + <env-entry-name>logback/configuration-resource</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <env-entry-value>my_config.xml</env-entry-value> +</env-entry></p> + + + <h3>Configuring Tomcat for ContextJNDISelector</h3> + + <p>First, place the logback jars (that is + logback-classic-${project.version}.jar, + logback-core-${project.version}.jar and + slf4j-api-${slff4j.version}.jar) in Tomcat's global (shared) class + folder. In Tomcat 6.x, this directory is + <em>$TOMCAT_HOME/lib/</em>. + </p> + + <p>The <em>logback.ContextSelector</em> system property can be set + by adding the following line to the <em>catalina.sh</em> script, + catalina.bat in Windows, found under <em>$TOMCAT_HOME/bin</em> + folder.</p> + + <p class="source">JAVA_OPTS="$JAVA_OPTS -Dlogback.ContextSelector=JNDI</p> + + + <h3>Hot deploying applications</h3> + + + <p>When the web-application is recycled or shutdown, we strongly + recommend that the older <code>LoggerContext</code> be closed and + subsequently discarded. Logback ships with a + <code>ServletContextListener</code> called + <code>ContextDetachingSCL</code>, designed specifically for + detaching the <code>ContextSelector</code> instance associated + with the older web-application instance. In order to install it, + add the following lines to your web-applications <em>web.xml</em> + file.</p> + + <p class="source"><listener> + <listener-class>ch.qos.logback.classic.selector.servlet.ContextDetachingSCL</listener-class> +</listener></p> + + <h3>Better performance</h3> + + <p>When <code>ContextJNDISelector</code> is active, each time a + logger is retrieved, a JNDI lookup must be performed. This can + negatively impact performance, especially if you are using + non-static (aka instance) logger references. Logback ships with a + servlet filter named <a + href="../xref/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.html">LoggerContextFilter</a>, + specifically designed to circumvent the JNDI lookup cost. It can + be installed by adding the following lines to your applications + web.xml file.</p> + + <p class="source"><filter> + <filter-name>LoggerContextFilter</filter-name> + <filter-class>ch.qos.logback.classic.selector.servlet.LoggerContextFilter</filter-class> +</filter> +<filter-mapping> + <filter-name>LoggerContextFilter</filter-name> + <url-pattern>/*</url-pattern> +</filter-mapping></p> + + <p>At the beginning of each http-request, + <code>LoggerContextFilter</code> will obtain the logger context + associated with the application and then place it in a + <code>ThreadLocal</code> variable. <code>ContextJNDISelector</code> + will first check if the said <code>ThreadLocal</code> variable is + set. If it is set, then JNDI lookup will skipped. Note that at the + end of the http request, the <code>ThreadLocal</code> variable will + be nulled. Installing <code>LoggerContextFilter</code> improves + logger retrieval performance by a wide margin. + </p> + + <p>Nulling the <code>ThreadLocal</code> variable allows garbage + collection of the web-application when it is stopped or + recycled.</p> + + <script src="../templates/footer.js" type="text/javascript"></script> +</div> +</body> +</html> Modified: logback/trunk/logback-site/src/site/pages/manual/menu.js ============================================================================== --- logback/trunk/logback-site/src/site/pages/manual/menu.js (original) +++ logback/trunk/logback-site/src/site/pages/manual/menu.js Fri Nov 28 21:34:30 2008 @@ -7,5 +7,5 @@ document.write('<p class="menu"><a href="layouts.html"><b>Ch5: Layouts</b></a>'); document.write('<p class="menu"><a href="filters.html"><b>Ch6: Filter chains</b></a>'); document.write('<p class="menu"><a href="mdc.html"><b>Ch7: Mapped Diagnostic Contexts</b></a>'); -document.write('<p class="menu"><a href="contextSelector.html"><b>Ch8: Context Selectors</b></a>'); +document.write('<p class="menu"><a href="loggingSeparation.html"><b>Ch8: Logging Separation</b></a>'); document.write('<p class="menu"><a href="jmxConfig.html"><b>Ch9: JMX Configurator</b></a>'); Modified: logback/trunk/logback-site/src/site/pages/news.html ============================================================================== --- logback/trunk/logback-site/src/site/pages/news.html (original) +++ logback/trunk/logback-site/src/site/pages/news.html Fri Nov 28 21:34:30 2008 @@ -84,31 +84,35 @@ files from classpath resources. </p> + <p>Fixed <a + href="http://jira.qos.ch/browse/LBCLASSIC-86">LBCLASSIC-86</a> + related to <code>AccessControlException</code> thrown when run in + a JVM with a <code>SecurityManager</code>. + </p> - <!-- ======================== minor ================== --> - <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-69">bug - LBCLASSIC-69</a> reported by Anton Tagunov. The - LevelToSyslogSeverity now correctly handles the TRACE level. - </p> + <!-- ======================== minor ================== --> - <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-57">bug - LBCLASSIC-57</a> reported by Anton Tagunov. SyslogAppender could - overwhelm the Syslog server with very large messages. SyslogAppender - now limits its message size to 256K. - </p> + <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-69">bug + LBCLASSIC-69</a> reported by Anton Tagunov. The + LevelToSyslogSeverity now correctly handles the TRACE level. + </p> + <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-57">bug + LBCLASSIC-57</a> reported by Anton Tagunov. SyslogAppender could + overwhelm the Syslog server with very large messages. SyslogAppender + now limits its message size to 256K. + </p> - <p>Fixed issue <a - href="http://jira.qos.ch/browse/LBCLASSIC-49">LBCLASSIC-49</a> - reported by Oliver Lietz. The getLogger() method in - <code>LoggerContext</code> class will now throw an - <code>IllegalArgumentException</code> when invoked with a null - argument. - </p> + <p>Fixed issue <a + href="http://jira.qos.ch/browse/LBCLASSIC-49">LBCLASSIC-49</a> + reported by Oliver Lietz. The getLogger() method in + <code>LoggerContext</code> class will now throw an + <code>IllegalArgumentException</code> when invoked with a null + argument. + </p> - <hr width="80%" align="center" /> Modified: logback/trunk/pom.xml ============================================================================== --- logback/trunk/pom.xml (original) +++ logback/trunk/pom.xml Fri Nov 28 21:34:30 2008 @@ -36,8 +36,7 @@ <properties> <!-- slf4j.version property is used below and in setClasspath.cmd --> - <slf4j.version>1.5.6-SNAPSHOT</slf4j.version> - <slf4j.ext.version>1.0-alpha0</slf4j.ext.version> + <slf4j.version>1.5.6</slf4j.version> <consolePlugin.version>1.1.0</consolePlugin.version> </properties> @@ -81,7 +80,7 @@ <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-ext</artifactId> - <version>${slf4j.ext.version}</version> + <version>${slf4j.version}</version> </dependency> <dependency>