[logback-dev] svn commit: r2034 - in logback/trunk: . logback-classic logback-classic/src/main/java/ch/qos/logback/classic/selector logback-classic/src/test/java/org/slf4j/impl logback-classic/src/test/resources logback-site/src/site/pages logback-site/src/site/pages/manual
noreply.ceki at qos.ch
noreply.ceki at qos.ch
Fri Nov 28 21:34:30 CET 2008
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>
More information about the logback-dev
mailing list