logback-dev
Threads by month
- ----- 2025 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
March 2010
- 11 participants
- 188 discussions

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-92-g32d669a
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 32d669a3ab35c87a919ca47712eaef295360a46e (commit)
from e540ea746cb1cf748343bdd8c3ce3bd364f50ff8 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=32d669a3ab35c87a919ca477…
http://github.com/ceki/logback/commit/32d669a3ab35c87a919ca47712eaef295360a…
commit 32d669a3ab35c87a919ca47712eaef295360a46e
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 16:10:52 2010 +0100
- updated the docs
diff --git a/logback-site/src/site/pages/manual/mdc.html b/logback-site/src/site/pages/manual/mdc.html
index 143b4ff..43e0c1a 100644
--- a/logback-site/src/site/pages/manual/mdc.html
+++ b/logback-site/src/site/pages/manual/mdc.html
@@ -652,15 +652,23 @@ public class UserServletFilter implements Filter {
</tr>
<tr class="alt">
- <td>request.remoteHost</td>
+ <td><code>req.remoteHost</code></td>
<td>as returned by the <a
- href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.…">getRemoteHost90</a>
+ href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.…">getRemoteHost()</a>
method
</td>
</tr>
- <tr>
- <td>request.requestURI</td>
+ <tr >
+ <td><code>req.xForwardedFor</code></td>
+ <td>value of the <a
+ href="http://en.wikipedia.org/wiki/X-Forwarded-For">"X-Forwarded-For"</a>
+ header
+ </td>
+ </tr>
+
+ <tr class="alt">
+ <td><code>req.requestURI</code></td>
<td>
as returned by <a
href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServle…">getRequestURI()</a>
@@ -668,8 +676,8 @@ public class UserServletFilter implements Filter {
</td>
</tr>
- <tr class="alt">
- <td>request.userAgent</td>
+ <tr >
+ <td><code>req.userAgent</code></td>
<td>value of the "User-Agent" header
</td>
</tr>
@@ -701,9 +709,16 @@ public class UserServletFilter implements Filter {
<p>Once the filter is installed, values corresponding to each MDC
key will be output by the %X <a
- href="layouts.html#conversionWord">conversion word</a>.
+ href="layouts.html#conversionWord">conversion word</a> acoording to
+ the key passes as first option. For example, to print the remote
+ host followed by the request URI on one line, the date followed by
+ the message on the next, you would set <code>PatternLayout</code>'s
+ pattern to:
+
</p>
+ <p class="source">%X{req.remoteHost} %X{req.requestURI}%n%d - %m%n</p>
+
<script src="../templates/footer.js" type="text/javascript"></script>
</div>
</body>
-----------------------------------------------------------------------
Summary of changes:
logback-site/src/site/pages/manual/mdc.html | 29 ++++++++++++++++++++------
1 files changed, 22 insertions(+), 7 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-91-ge540ea7
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via e540ea746cb1cf748343bdd8c3ce3bd364f50ff8 (commit)
from 114e8b1da6d072b06900f9015c8e8db0c5f8b273 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=e540ea746cb1cf748343bdd8…
http://github.com/ceki/logback/commit/e540ea746cb1cf748343bdd8c3ce3bd364f50…
commit e540ea746cb1cf748343bdd8c3ce3bd364f50ff8
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 15:35:49 2010 +0100
- moved ContextSelectorStaticBinder from src/test to src/main. D'oh!
- MDCInsertingServletFilter now inserts xForwardedFor entry
diff --git a/logback-classic/pom.xml b/logback-classic/pom.xml
index ec367ab..bdb2ec6 100644
--- a/logback-classic/pom.xml
+++ b/logback-classic/pom.xml
@@ -270,13 +270,15 @@ org.slf4j.test_osgi
config files). They won't be found by Bnd's analysis
of java code. -->
+ <!-- importing ch.qos.logback.classic.util is strange but
+ is required for the OSGi integration tests to pass
+ -->
<Import-Package>
sun.reflect;resolution:=optional,
javax.*;resolution:=optional,
org.xml.*;resolution:=optional,
ch.qos.logback.core.rolling,
ch.qos.logback.core.rolling.helper,
- ch.qos.logback.classic.util,
*
</Import-Package>
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java b/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
index 8a19e96..492c8e4 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
@@ -33,8 +33,9 @@ public class ClassicConstants {
*/
public static final int DEFAULT_MAX_CALLEDER_DATA_DEPTH = 8;
- public final static String REQUEST_REMOTE_HOST_MDC_KEY = "request.remoteHost";
- public final static String REQUEST_USER_AGENT_MDC_KEY = "request.userAgent";
- public final static String REQUEST_REQUST_URI = "request.requestURI";
+ public final static String REQUEST_REMOTE_HOST_MDC_KEY = "req.remoteHost";
+ public final static String REQUEST_USER_AGENT_MDC_KEY = "req.userAgent";
+ public final static String REQUEST_REQUST_URI = "req.requestURI";
+ public final static String REQUEST_X_FORWARDED_FOR = "req.xForwardedFor";
}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java
index 250c5c4..d9f25d6 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java
@@ -64,6 +64,8 @@ public class MDCInsertingServletFilter implements Filter {
.getRequestURI());
MDC.put(ClassicConstants.REQUEST_USER_AGENT_MDC_KEY, httpServletRequest
.getHeader("User-Agent"));
+ MDC.put(ClassicConstants.REQUEST_X_FORWARDED_FOR, httpServletRequest
+ .getHeader("X-Forwarded-For"));
}
}
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java b/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java
similarity index 100%
rename from logback-classic/src/test/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java
rename to logback-classic/src/main/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java
diff --git a/logback-site/src/site/pages/news.html b/logback-site/src/site/pages/news.html
index b6b13a3..8d5fb90 100644
--- a/logback-site/src/site/pages/news.html
+++ b/logback-site/src/site/pages/news.html
@@ -68,6 +68,13 @@
after the connection to the server is re-established.
</p>
+ <p>The packages under <code>ch.qos.logback.classic</code>
+ namespace no longer depend on <code>org.slf4j.impl</code>. This
+ fixes <a
+ href="http://jira.qos.ch/browse/LBCLASSIC-184">LBCLASSIC-184</a>
+ reported by Gunnar Wagenknecht.
+ </p>
+
<p>Fixed <a
href="http://jira.qos.ch/browse/LBCLASSIC-193">LBCLASSIC-193</a>.
<code>SyslogAppender</code> will no longer shutdown when messages
-----------------------------------------------------------------------
Summary of changes:
logback-classic/pom.xml | 4 +++-
.../ch/qos/logback/classic/ClassicConstants.java | 7 ++++---
.../classic/helpers/MDCInsertingServletFilter.java | 2 ++
.../classic/util/ContextSelectorStaticBinder.java | 0
logback-site/src/site/pages/news.html | 7 +++++++
5 files changed, 16 insertions(+), 4 deletions(-)
rename logback-classic/src/{test => main}/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java (100%)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-90-g114e8b1
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 114e8b1da6d072b06900f9015c8e8db0c5f8b273 (commit)
from 4fa9166747fccbaed7f35a5c877d0aaaf41168c5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=114e8b1da6d072b06900f901…
http://github.com/ceki/logback/commit/114e8b1da6d072b06900f9015c8e8db0c5f8b…
commit 114e8b1da6d072b06900f9015c8e8db0c5f8b273
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 14:41:19 2010 +0100
- added an import on ch.qos.logback.classic.util in
logback-classic.jar manifest as suggested by the Felix OSGi framework.
OSGI integration tests pass.
diff --git a/logback-classic/pom.xml b/logback-classic/pom.xml
index 977b07f..ec367ab 100644
--- a/logback-classic/pom.xml
+++ b/logback-classic/pom.xml
@@ -275,7 +275,8 @@ org.slf4j.test_osgi
javax.*;resolution:=optional,
org.xml.*;resolution:=optional,
ch.qos.logback.core.rolling,
- ch.qos.logback.core.rolling.helper,
+ ch.qos.logback.core.rolling.helper,
+ ch.qos.logback.classic.util,
*
</Import-Package>
-----------------------------------------------------------------------
Summary of changes:
logback-classic/pom.xml | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-89-g4fa9166
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 4fa9166747fccbaed7f35a5c877d0aaaf41168c5 (commit)
from 8e4097f3a23fc9ddc57846ad55e5c7100d2a4a63 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=4fa9166747fccbaed7f35a5c…
http://github.com/ceki/logback/commit/4fa9166747fccbaed7f35a5c877d0aaaf4116…
commit 4fa9166747fccbaed7f35a5c877d0aaaf41168c5
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 13:48:52 2010 +0100
- removed references to org.slf4j.impl package from ch.qos.logback.classic
as requested in LBCLASSIC-184
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java b/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java
index fdfc23b..981e2cd 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java
@@ -21,10 +21,10 @@ import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.slf4j.Logger;
-import org.slf4j.impl.StaticLoggerBinder;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.selector.ContextSelector;
+import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
import ch.qos.logback.classic.util.JNDIUtil;
public class ContextDetachingSCL implements ServletContextListener {
@@ -41,7 +41,7 @@ public class ContextDetachingSCL implements ServletContextListener {
if (loggerContextName != null) {
System.out.println("About to detach context named " + loggerContextName);
- ContextSelector selector = StaticLoggerBinder.getSingleton().getContextSelector();
+ ContextSelector selector = ContextSelectorStaticBinder.getSingleton().getContextSelector();
LoggerContext context = selector.detachLoggerContext(loggerContextName);
if (context != null) {
Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.java
index 3b18bd1..5f80a7c 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.java
@@ -23,11 +23,11 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.slf4j.LoggerFactory;
-import org.slf4j.impl.StaticLoggerBinder;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.selector.ContextJNDISelector;
import ch.qos.logback.classic.selector.ContextSelector;
+import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
/**
* A servlet filter that puts the environment dependent LoggerContext in a
@@ -58,7 +58,7 @@ public class LoggerContextFilter implements Filter {
FilterChain chain) throws IOException, ServletException {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
- ContextSelector selector = StaticLoggerBinder.getSingleton().getContextSelector();
+ ContextSelector selector = ContextSelectorStaticBinder.getSingleton().getContextSelector();
ContextJNDISelector sel = null;
if (selector instanceof ContextJNDISelector) {
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/sift/JNDIBasedContextDiscriminator.java b/logback-classic/src/main/java/ch/qos/logback/classic/sift/JNDIBasedContextDiscriminator.java
index 499c2f6..dac6a24 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/sift/JNDIBasedContextDiscriminator.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/sift/JNDIBasedContextDiscriminator.java
@@ -13,11 +13,10 @@
*/
package ch.qos.logback.classic.sift;
-import org.slf4j.impl.StaticLoggerBinder;
-
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.selector.ContextSelector;
import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
import ch.qos.logback.core.sift.Discriminator;
import ch.qos.logback.core.spi.ContextAwareBase;
@@ -45,7 +44,7 @@ public class JNDIBasedContextDiscriminator extends ContextAwareBase implements
* Return the name of the current context name as found in the logging event.
*/
public String getDiscriminatingValue(ILoggingEvent event) {
- ContextSelector selector = StaticLoggerBinder.getSingleton()
+ ContextSelector selector = ContextSelectorStaticBinder.getSingleton()
.getContextSelector();
if (selector == null) {
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
index dad1588..867c9d2 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
@@ -19,11 +19,11 @@ import java.util.Map;
import org.slf4j.MDC;
import org.slf4j.Marker;
import org.slf4j.helpers.MessageFormatter;
-import org.slf4j.impl.LogbackMDCAdapter;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.util.LogbackMDCAdapter;
/**
* The internal representation of logging events. When an affirmative decision
diff --git a/logback-classic/src/main/java/org/slf4j/impl/CopyOnInheritThreadLocal.java b/logback-classic/src/main/java/ch/qos/logback/classic/util/CopyOnInheritThreadLocal.java
similarity index 96%
rename from logback-classic/src/main/java/org/slf4j/impl/CopyOnInheritThreadLocal.java
rename to logback-classic/src/main/java/ch/qos/logback/classic/util/CopyOnInheritThreadLocal.java
index 5b2a519..116821a 100644
--- a/logback-classic/src/main/java/org/slf4j/impl/CopyOnInheritThreadLocal.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/util/CopyOnInheritThreadLocal.java
@@ -11,7 +11,7 @@
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
-package org.slf4j.impl;
+package ch.qos.logback.classic.util;
import java.util.HashMap;
diff --git a/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java b/logback-classic/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java
similarity index 98%
rename from logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java
rename to logback-classic/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java
index 93b4c1e..9af2532 100644
--- a/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java
@@ -11,7 +11,7 @@
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
-package org.slf4j.impl;
+package ch.qos.logback.classic.util;
import java.util.HashMap;
import java.util.Map;
@@ -19,6 +19,7 @@ import java.util.Set;
import org.slf4j.spi.MDCAdapter;
+
/**
* A <em>Mapped Diagnostic Context</em>, or MDC in short, is an instrument
* for distinguishing interleaved log output from different sources. Log output
@@ -39,7 +40,7 @@ public class LogbackMDCAdapter implements MDCAdapter {
final CopyOnInheritThreadLocal copyOnInheritThreadLocal = new CopyOnInheritThreadLocal();
- LogbackMDCAdapter() {
+ public LogbackMDCAdapter() {
}
/**
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/util/LoggerStatusPrinter.java b/logback-classic/src/main/java/ch/qos/logback/classic/util/LoggerStatusPrinter.java
deleted file mode 100644
index 56004be..0000000
--- a/logback-classic/src/main/java/ch/qos/logback/classic/util/LoggerStatusPrinter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Logback: the reliable, generic, fast and flexible logging framework.
- * Copyright (C) 1999-2009, QOS.ch. All rights reserved.
- *
- * This program and the accompanying materials are dual-licensed under
- * either the terms of the Eclipse Public License v1.0 as published by
- * the Eclipse Foundation
- *
- * or (per the licensee's choosing)
- *
- * under the terms of the GNU Lesser General Public License version 2.1
- * as published by the Free Software Foundation.
- */
-package ch.qos.logback.classic.util;
-
-import org.slf4j.LoggerFactory;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.core.util.StatusPrinter;
-
-public class LoggerStatusPrinter {
-
- public static void printStatusInDefaultContext() {
- LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
- StatusPrinter.print(lc);
- }
-
-}
diff --git a/logback-classic/src/main/java/org/slf4j/impl/StaticLoggerBinder.java b/logback-classic/src/main/java/org/slf4j/impl/StaticLoggerBinder.java
index f8c2ea8..c0ef94f 100644
--- a/logback-classic/src/main/java/org/slf4j/impl/StaticLoggerBinder.java
+++ b/logback-classic/src/main/java/org/slf4j/impl/StaticLoggerBinder.java
@@ -13,24 +13,16 @@
*/
package org.slf4j.impl;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
import org.slf4j.ILoggerFactory;
import org.slf4j.LoggerFactory;
import org.slf4j.helpers.Util;
import org.slf4j.spi.LoggerFactoryBinder;
-import ch.qos.logback.classic.ClassicConstants;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.selector.ContextJNDISelector;
-import ch.qos.logback.classic.selector.ContextSelector;
-import ch.qos.logback.classic.selector.DefaultContextSelector;
import ch.qos.logback.classic.util.ContextInitializer;
+import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.joran.spi.JoranException;
-import ch.qos.logback.core.util.Loader;
-import ch.qos.logback.core.util.OptionHelper;
import ch.qos.logback.core.util.StatusPrinter;
/**
@@ -38,7 +30,7 @@ import ch.qos.logback.core.util.StatusPrinter;
* The binding of {@link LoggerFactory} class with an actual instance of
* {@link ILoggerFactory} is performed using information returned by this class.
*
- * @author <a href="http://www.qos.ch/log4j/">Ceki Gülcü</a>
+ * @author <a href="http://www.qos.ch/shop/products/log4jManual">Ceki Gülcü</a>
*/
public class StaticLoggerBinder implements LoggerFactoryBinder {
@@ -47,7 +39,7 @@ public class StaticLoggerBinder implements LoggerFactoryBinder {
* against. The value of this field is usually modified with each release.
*/
// to avoid constant folding by the compiler, this field must *not* be final
- public static String REQUESTED_API_VERSION = "1.5.8"; // !final
+ public static String REQUESTED_API_VERSION = "1.5.11"; // !final
final static String NULL_CS_URL = CoreConstants.CODES_URL + "#null_CS";
@@ -56,14 +48,16 @@ public class StaticLoggerBinder implements LoggerFactoryBinder {
*/
private static StaticLoggerBinder SINGLETON = new StaticLoggerBinder();
+ private static Object KEY = new Object();
+
static {
SINGLETON.init();
}
private boolean initialized = false;
private LoggerContext defaultLoggerContext = new LoggerContext();
- private ContextSelector contextSelector;
-
+ private final ContextSelectorStaticBinder contextSelectorBinder = ContextSelectorStaticBinder.getSingleton();
+
private StaticLoggerBinder() {
defaultLoggerContext.setName(CoreConstants.DEFAULT_CONTEXT_NAME);
}
@@ -92,19 +86,7 @@ public class StaticLoggerBinder implements LoggerFactoryBinder {
je);
}
StatusPrinter.printInCaseOfErrorsOrWarnings(defaultLoggerContext);
-
- // See if a special context selector is needed
- String contextSelectorStr = OptionHelper
- .getSystemProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR);
- if (contextSelectorStr == null) {
- contextSelector = new DefaultContextSelector(defaultLoggerContext);
- } else if (contextSelectorStr.equals("JNDI")) {
- // if jndi is specified, let's use the appropriate class
- contextSelector = new ContextJNDISelector(defaultLoggerContext);
- } else {
- contextSelector = dynamicalContextSelector(defaultLoggerContext,
- contextSelectorStr);
- }
+ contextSelectorBinder.init(defaultLoggerContext, KEY);
initialized = true;
} catch (Throwable t) {
// we should never get here
@@ -113,55 +95,23 @@ public class StaticLoggerBinder implements LoggerFactoryBinder {
}
}
- /**
- * Intantiate the context selector class designated by the user. The selector
- * must have a constructor taking a LoggerContext instance as an argument.
- *
- * @param defaultLoggerContext
- * @param contextSelectorStr
- * @return an instance of the designated context selector class
- * @throws ClassNotFoundException
- * @throws SecurityException
- * @throws NoSuchMethodException
- * @throws IllegalArgumentException
- * @throws InstantiationException
- * @throws IllegalAccessException
- * @throws InvocationTargetException
- */
- static ContextSelector dynamicalContextSelector(
- LoggerContext defaultLoggerContext, String contextSelectorStr)
- throws ClassNotFoundException, SecurityException, NoSuchMethodException,
- IllegalArgumentException, InstantiationException, IllegalAccessException,
- InvocationTargetException {
- Class<?> contextSelectorClass = Loader.loadClass(contextSelectorStr);
- Constructor cons = contextSelectorClass
- .getConstructor(new Class[] { LoggerContext.class });
- return (ContextSelector) cons.newInstance(defaultLoggerContext);
- }
+
public ILoggerFactory getLoggerFactory() {
if (!initialized) {
return defaultLoggerContext;
}
- if (contextSelector == null) {
+ if (contextSelectorBinder.getContextSelector() == null) {
throw new IllegalStateException(
"contextSelector cannot be null. See also " + NULL_CS_URL);
}
- return contextSelector.getLoggerContext();
+ return contextSelectorBinder.getContextSelector().getLoggerContext();
}
public String getLoggerFactoryClassStr() {
- return contextSelector.getClass().getName();
- }
-
- /**
- * Return the {@link ContextSelector} instance in use.
- *
- * @return the ContextSelector instance in use
- */
- public ContextSelector getContextSelector() {
- return contextSelector;
+ return contextSelectorBinder.getContextSelector().getClass().getName();
}
+
}
diff --git a/logback-classic/src/main/java/org/slf4j/impl/StaticMDCBinder.java b/logback-classic/src/main/java/org/slf4j/impl/StaticMDCBinder.java
index c24fca8..70c13b0 100644
--- a/logback-classic/src/main/java/org/slf4j/impl/StaticMDCBinder.java
+++ b/logback-classic/src/main/java/org/slf4j/impl/StaticMDCBinder.java
@@ -15,6 +15,8 @@ package org.slf4j.impl;
import org.slf4j.spi.MDCAdapter;
+import ch.qos.logback.classic.util.LogbackMDCAdapter;
+
/**
* This implementation is bound to {@link LogbackMDCAdapter}.
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest.java
index 260082c..192f580 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest.java
@@ -19,10 +19,10 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.LoggerFactory;
-import org.slf4j.impl.StaticLoggerBinder;
import ch.qos.logback.classic.ClassicConstants;
import ch.qos.logback.classic.selector.servlet.ContextDetachingSCL;
+import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
import ch.qos.logback.classic.util.MockInitialContext;
import ch.qos.logback.classic.util.MockInitialContextFactory;
@@ -30,14 +30,14 @@ public class ContextDetachingSCLTest {
static String INITIAL_CONTEXT_KEY = "java.naming.factory.initial";
- ContextDetachingSCL listener;
+ ContextDetachingSCL cobtextDetachingSCL;
@Before
public void setUp() throws Exception {
System.setProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR, "JNDI");
//LoggerFactory.setup();
- listener = new ContextDetachingSCL();
+ cobtextDetachingSCL = new ContextDetachingSCL();
MockInitialContextFactory.initialize();
MockInitialContext mic = MockInitialContextFactory.getContext();
@@ -58,8 +58,8 @@ public class ContextDetachingSCLTest {
@Test
public void testDetach() {
- ContextJNDISelector selector = (ContextJNDISelector) StaticLoggerBinder.getSingleton().getContextSelector();
- listener.contextDestroyed(null);
+ ContextJNDISelector selector = (ContextJNDISelector) ContextSelectorStaticBinder.getSingleton().getContextSelector();
+ cobtextDetachingSCL.contextDestroyed(null);
assertEquals(0, selector.getCount());
}
@@ -68,12 +68,12 @@ public class ContextDetachingSCLTest {
public void testDetachWithMissingContext() {
MockInitialContext mic = MockInitialContextFactory.getContext();
mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "tata");
- ContextJNDISelector selector = (ContextJNDISelector) StaticLoggerBinder.getSingleton().getContextSelector();
+ ContextJNDISelector selector = (ContextJNDISelector) ContextSelectorStaticBinder.getSingleton().getContextSelector();
assertEquals("tata", selector.getLoggerContext().getName());
mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "titi");
assertEquals("titi", selector.getLoggerContext().getName());
- listener.contextDestroyed(null);
+ cobtextDetachingSCL.contextDestroyed(null);
assertEquals(2, selector.getCount());
}
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest.java
index 8e41eb1..59cdafe 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest.java
@@ -19,10 +19,10 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.LoggerFactory;
-import org.slf4j.impl.StaticLoggerBinder;
import org.slf4j.impl.StaticLoggerBinderFriend;
import ch.qos.logback.classic.ClassicConstants;
+import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
import ch.qos.logback.classic.util.MockInitialContext;
import ch.qos.logback.classic.util.MockInitialContextFactory;
import ch.qos.logback.core.Context;
@@ -55,7 +55,7 @@ public class ContextJNDISelectorTest {
@Test
public void testGetExistingContext() {
- ContextSelector selector = StaticLoggerBinder.getSingleton().getContextSelector();
+ ContextSelector selector = ContextSelectorStaticBinder.getSingleton().getContextSelector();
Context context = selector.getLoggerContext();
assertEquals("toto", context.getName());
}
@@ -67,7 +67,7 @@ public class ContextJNDISelectorTest {
LoggerFactory.getLogger(ContextDetachingSCLTest.class);
- ContextJNDISelector selector = (ContextJNDISelector)StaticLoggerBinder.getSingleton().getContextSelector();
+ ContextJNDISelector selector = (ContextJNDISelector)ContextSelectorStaticBinder.getSingleton().getContextSelector();
Context context = selector.getLoggerContext();
assertEquals("tata", context.getName());
System.out.println(selector.getContextNames());
@@ -79,7 +79,7 @@ public class ContextJNDISelectorTest {
MockInitialContext mic = MockInitialContextFactory.getContext();
mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, null);
- ContextJNDISelector selector = (ContextJNDISelector)StaticLoggerBinder.getSingleton().getContextSelector();
+ ContextJNDISelector selector = (ContextJNDISelector)ContextSelectorStaticBinder.getSingleton().getContextSelector();
Context context = selector.getLoggerContext();
assertEquals("default", context.getName());
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java b/logback-classic/src/test/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java
new file mode 100644
index 0000000..a2d9a02
--- /dev/null
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java
@@ -0,0 +1,107 @@
+/**
+ * Logback: the reliable, generic, fast and flexible logging framework.
+ * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
+ *
+ * This program and the accompanying materials are dual-licensed under either
+ * the terms of the Eclipse Public License v1.0 as published by the Eclipse
+ * Foundation
+ *
+ * or (per the licensee's choosing)
+ *
+ * under the terms of the GNU Lesser General Public License version 2.1 as
+ * published by the Free Software Foundation.
+ */
+package ch.qos.logback.classic.util;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import ch.qos.logback.classic.ClassicConstants;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.selector.ContextJNDISelector;
+import ch.qos.logback.classic.selector.ContextSelector;
+import ch.qos.logback.classic.selector.DefaultContextSelector;
+import ch.qos.logback.core.util.Loader;
+import ch.qos.logback.core.util.OptionHelper;
+
+/**
+ * Holds the context selector for use in the current environment.
+ *
+ * @author Ceki Gülcü
+ * @since 0.9.19
+ */
+public class ContextSelectorStaticBinder {
+
+ static ContextSelectorStaticBinder singleton = new ContextSelectorStaticBinder();
+
+ ContextSelector contextSelector;
+ Object key;
+
+ public static ContextSelectorStaticBinder getSingleton() {
+ return singleton;
+ }
+
+ /**
+ * FOR INTERNAL USE. This method is intended for use by StaticLoggerBinder.
+ *
+ * @param defaultLoggerContext
+ * @throws ClassNotFoundException
+ * @throws NoSuchMethodException
+ * @throws InstantiationException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public void init(LoggerContext defaultLoggerContext, Object key) throws ClassNotFoundException,
+ NoSuchMethodException, InstantiationException, IllegalAccessException,
+ InvocationTargetException {
+ if(this.key == null) {
+ this.key = key;
+ } else if (this.key != key) {
+ throw new IllegalAccessException("Only certain classes can access this method.");
+ }
+
+
+ String contextSelectorStr = OptionHelper
+ .getSystemProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR);
+ if (contextSelectorStr == null) {
+ contextSelector = new DefaultContextSelector(defaultLoggerContext);
+ } else if (contextSelectorStr.equals("JNDI")) {
+ // if jndi is specified, let's use the appropriate class
+ contextSelector = new ContextJNDISelector(defaultLoggerContext);
+ } else {
+ contextSelector = dynamicalContextSelector(defaultLoggerContext,
+ contextSelectorStr);
+ }
+ }
+
+ /**
+ * Intantiate the context selector class designated by the user. The selector
+ * must have a constructor taking a LoggerContext instance as an argument.
+ *
+ * @param defaultLoggerContext
+ * @param contextSelectorStr
+ * @return an instance of the designated context selector class
+ * @throws ClassNotFoundException
+ * @throws SecurityException
+ * @throws NoSuchMethodException
+ * @throws IllegalArgumentException
+ * @throws InstantiationException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ static ContextSelector dynamicalContextSelector(
+ LoggerContext defaultLoggerContext, String contextSelectorStr)
+ throws ClassNotFoundException, SecurityException, NoSuchMethodException,
+ IllegalArgumentException, InstantiationException, IllegalAccessException,
+ InvocationTargetException {
+ Class<?> contextSelectorClass = Loader.loadClass(contextSelectorStr);
+ Constructor cons = contextSelectorClass
+ .getConstructor(new Class[] { LoggerContext.class });
+ return (ContextSelector) cons.newInstance(defaultLoggerContext);
+ }
+
+ public ContextSelector getContextSelector() {
+ return contextSelector;
+ }
+
+}
diff --git a/logback-classic/src/test/java/org/slf4j/impl/LogbackMDCAdapterTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java
similarity index 95%
rename from logback-classic/src/test/java/org/slf4j/impl/LogbackMDCAdapterTest.java
rename to logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java
index 8546cca..4c8cf51 100644
--- a/logback-classic/src/test/java/org/slf4j/impl/LogbackMDCAdapterTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java
@@ -11,7 +11,7 @@
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
-package org.slf4j.impl;
+package ch.qos.logback.classic.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -24,6 +24,9 @@ import java.util.Random;
import org.junit.Test;
import org.slf4j.MDC;
+import ch.qos.logback.classic.util.CopyOnInheritThreadLocal;
+import ch.qos.logback.classic.util.LogbackMDCAdapter;
+
public class LogbackMDCAdapterTest {
final static String A_SUFFIX = "A_SUFFIX";
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/util/PackageTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/util/PackageTest.java
index 4b63ded..0256b5a 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/util/PackageTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/util/PackageTest.java
@@ -19,7 +19,7 @@ import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
-(a)SuiteClasses({InitializationTest.class, LevelToSyslogSeverityTest.class} )
+(a)SuiteClasses({InitializationTest.class, LogbackMDCAdapterTest.class, LevelToSyslogSeverityTest.class} )
public class PackageTest {
}
\ No newline at end of file
diff --git a/logback-examples/src/main/java/chapters/architecture/HelloWorld2.java b/logback-examples/src/main/java/chapters/architecture/HelloWorld2.java
deleted file mode 100644
index 3480847..0000000
--- a/logback-examples/src/main/java/chapters/architecture/HelloWorld2.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Logback: the reliable, generic, fast and flexible logging framework.
- * Copyright (C) 1999-2009, QOS.ch. All rights reserved.
- *
- * This program and the accompanying materials are dual-licensed under
- * either the terms of the Eclipse Public License v1.0 as published by
- * the Eclipse Foundation
- *
- * or (per the licensee's choosing)
- *
- * under the terms of the GNU Lesser General Public License version 2.1
- * as published by the Free Software Foundation.
- */
-package chapters.architecture;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import ch.qos.logback.classic.util.LoggerStatusPrinter;
-
-public class HelloWorld2 {
-
- public static void main(String[] args) {
- Logger logger = LoggerFactory.getLogger("manual.architecture.HelloWorld2");
- logger.debug("Hello world.");
- LoggerStatusPrinter.printStatusInDefaultContext();
- }
-}
-----------------------------------------------------------------------
Summary of changes:
.../selector/servlet/ContextDetachingSCL.java | 4 +-
.../selector/servlet/LoggerContextFilter.java | 4 +-
.../sift/JNDIBasedContextDiscriminator.java | 5 +-
.../ch/qos/logback/classic/spi/LoggingEvent.java | 2 +-
.../classic/util}/CopyOnInheritThreadLocal.java | 2 +-
.../logback/classic/util}/LogbackMDCAdapter.java | 5 +-
.../logback/classic/util/LoggerStatusPrinter.java | 28 -----
.../java/org/slf4j/impl/StaticLoggerBinder.java | 76 +++------------
.../main/java/org/slf4j/impl/StaticMDCBinder.java | 2 +
.../classic/selector/ContextDetachingSCLTest.java | 14 ++--
.../classic/selector/ContextJNDISelectorTest.java | 8 +-
.../classic/util/ContextSelectorStaticBinder.java | 107 ++++++++++++++++++++
.../classic/util}/LogbackMDCAdapterTest.java | 5 +-
.../ch/qos/logback/classic/util/PackageTest.java | 2 +-
.../java/chapters/architecture/HelloWorld2.java | 28 -----
15 files changed, 149 insertions(+), 143 deletions(-)
rename logback-classic/src/main/java/{org/slf4j/impl => ch/qos/logback/classic/util}/CopyOnInheritThreadLocal.java (96%)
rename logback-classic/src/main/java/{org/slf4j/impl => ch/qos/logback/classic/util}/LogbackMDCAdapter.java (98%)
delete mode 100644 logback-classic/src/main/java/ch/qos/logback/classic/util/LoggerStatusPrinter.java
create mode 100644 logback-classic/src/test/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java
rename logback-classic/src/test/java/{org/slf4j/impl => ch/qos/logback/classic/util}/LogbackMDCAdapterTest.java (95%)
delete mode 100644 logback-examples/src/main/java/chapters/architecture/HelloWorld2.java
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-88-g8e4097f
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 8e4097f3a23fc9ddc57846ad55e5c7100d2a4a63 (commit)
from 1acd46c45fe243953ebebe85c20541b9a4b08e94 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=8e4097f3a23fc9ddc57846ad…
http://github.com/ceki/logback/commit/8e4097f3a23fc9ddc57846ad55e5c7100d2a4…
commit 8e4097f3a23fc9ddc57846ad55e5c7100d2a4a63
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 00:22:30 2010 +0100
- MDCInsertingServletFilter:
Within web-applications, it often proves helpful to know the hostname,
request uri and user-agent associated with a given http
request. MDCInsertingServletFilter inserts such data into the MDC.
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java b/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
index 8f06e53..8a19e96 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
@@ -17,8 +17,8 @@ public class ClassicConstants {
static public final String USER_MDC_KEY = "user";
public static final String LOGBACK_CONTEXT_SELECTOR = "logback.ContextSelector";
- public static String JNDI_CONFIGURATION_RESOURCE = "java:comp/env/logback/configuration-resource";
- public static String JNDI_CONTEXT_NAME = "java:comp/env/logback/context-name";
+ public static final String JNDI_CONFIGURATION_RESOURCE = "java:comp/env/logback/configuration-resource";
+ public static final String JNDI_CONTEXT_NAME = "java:comp/env/logback/context-name";
/**
* The maximum number of package separators (dots) that abbreviation
@@ -32,4 +32,9 @@ public class ClassicConstants {
* The default stack data depth computed during caller data extraction.
*/
public static final int DEFAULT_MAX_CALLEDER_DATA_DEPTH = 8;
+
+ public final static String REQUEST_REMOTE_HOST_MDC_KEY = "request.remoteHost";
+ public final static String REQUEST_USER_AGENT_MDC_KEY = "request.userAgent";
+ public final static String REQUEST_REQUST_URI = "request.requestURI";
+
}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java
new file mode 100644
index 0000000..250c5c4
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java
@@ -0,0 +1,80 @@
+/**
+ * Logback: the reliable, generic, fast and flexible logging framework.
+ * Copyright (C) 1999-2009, QOS.ch. All rights reserved.
+ *
+ * This program and the accompanying materials are dual-licensed under
+ * either the terms of the Eclipse Public License v1.0 as published by
+ * the Eclipse Foundation
+ *
+ * or (per the licensee's choosing)
+ *
+ * under the terms of the GNU Lesser General Public License version 2.1
+ * as published by the Free Software Foundation.
+ */
+package ch.qos.logback.classic.helpers;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.MDC;
+
+import ch.qos.logback.classic.ClassicConstants;
+
+/**
+ * A servlet filter that inserts various values retrieved from the incoming http
+ * request into the MDC.
+ *
+ * <p>The values are removed after the request is processed.
+ *
+ * @author Ceki Gülcü
+ */
+public class MDCInsertingServletFilter implements Filter {
+
+ public void destroy() {
+ // do nothing
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response,
+ FilterChain chain) throws IOException, ServletException {
+
+ insertIntoMDC(request);
+
+ try {
+ chain.doFilter(request, response);
+ } finally {
+ clearMDC();
+ }
+ }
+
+ void insertIntoMDC(ServletRequest request) {
+
+ MDC.put(ClassicConstants.REQUEST_REMOTE_HOST_MDC_KEY, request
+ .getRemoteHost());
+
+ if (request instanceof HttpServletRequest) {
+ HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+ MDC.put(ClassicConstants.REQUEST_REQUST_URI, httpServletRequest
+ .getRequestURI());
+ MDC.put(ClassicConstants.REQUEST_USER_AGENT_MDC_KEY, httpServletRequest
+ .getHeader("User-Agent"));
+ }
+
+ }
+
+ void clearMDC() {
+ MDC.remove(ClassicConstants.REQUEST_REMOTE_HOST_MDC_KEY);
+ MDC.remove(ClassicConstants.REQUEST_REQUST_URI);
+ MDC.remove(ClassicConstants.REQUEST_USER_AGENT_MDC_KEY);
+ }
+
+ public void init(FilterConfig arg0) throws ServletException {
+ // do nothing
+ }
+}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java b/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java
index ddfe5af..9152f46 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java
@@ -16,6 +16,7 @@ package ch.qos.logback.classic.html;
import java.util.Map;
import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.pattern.MDCConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.html.DefaultCssBuilder;
import ch.qos.logback.core.html.HTMLLayoutBase;
@@ -123,4 +124,19 @@ public class HTMLLayout extends HTMLLayoutBase<ILoggingEvent> {
public void setThrowableRenderer(IThrowableRenderer<ILoggingEvent> throwableRenderer) {
this.throwableRenderer = throwableRenderer;
}
+
+ @Override
+ protected String computeConverterName(Converter c) {
+ if(c instanceof MDCConverter) {
+ MDCConverter mc = (MDCConverter) c;
+ String key = mc.getFirstOption();
+ if(key != null) {
+ return key;
+ } else {
+ return "MDC";
+ }
+ } else {
+ return super.computeConverterName(c);
+ }
+ }
}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.java
index e9e7af6..3b18bd1 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.java
@@ -30,17 +30,15 @@ import ch.qos.logback.classic.selector.ContextJNDISelector;
import ch.qos.logback.classic.selector.ContextSelector;
/**
- * A servlet filter that puts the environment-dependend
- * LoggerContext in a Threadlocal variable.
- *
- * It removes it after the request is processed.
- *
- * To use it, add the following lines to a web.xml file
+ * A servlet filter that puts the environment dependent LoggerContext in a
+ * ThreadLocal variable, removing it after the request is processed.
*
+ * <p>To use it, add the following lines to a web.xml file
+ *
* <filter>
* <filter-name>LoggerContextFilter</filter-name>
* <filter-class>
- * ch.qos.userApp.LoggerContextFilter
+ * ch.qos.logback.classic.selector.servlet.LoggerContextFilter
* </filter-class>
* </filter>
* <filter-mapping>
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/DynamicConverter.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/DynamicConverter.java
index 9e0f516..53eb3b8 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/DynamicConverter.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/DynamicConverter.java
@@ -56,7 +56,7 @@ abstract public class DynamicConverter<E> extends FormattingConverter<E>
*
* @return First option, may be null.
*/
- protected String getFirstOption() {
+ public String getFirstOption() {
if (optionList == null || optionList.size() == 0) {
return null;
} else {
diff --git a/logback-site/src/site/pages/manual/mdc.html b/logback-site/src/site/pages/manual/mdc.html
index 8b0bf37..143b4ff 100644
--- a/logback-site/src/site/pages/manual/mdc.html
+++ b/logback-site/src/site/pages/manual/mdc.html
@@ -615,7 +615,8 @@ public class UserServletFilter implements Filter {
- <h3>MDC And Managed Threads</h3>
+ <h3><a name="managedThreads" href="#managedThreads">MDC And Managed
+ Threads</a></h3>
<p>A copy of the mapped diagnostic context can not always be
inherited by worker threads from the initiating thread. This is the
@@ -634,6 +635,74 @@ public class UserServletFilter implements Filter {
managed thread.
</p>
+ <h2><a name="mis"
+ href="#mis"><code>MDCInsertingServletFilter</code></a></h2>
+
+ <p>Within web-applications, it often proves helpful to know the
+ hostname, request uri and user-agent associated with a given http
+ request. <a
+ href="../xref/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.html"><code>MDCInsertingServletFilter</code></a>
+ inserts such data into the MDC under the following keys.
+ </p>
+
+ <table class="bodyTable">
+ <tr>
+ <th>MDC key</th>
+ <th>MDC value</th>
+ </tr>
+
+ <tr class="alt">
+ <td>request.remoteHost</td>
+ <td>as returned by the <a
+ href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.…">getRemoteHost90</a>
+ method
+ </td>
+ </tr>
+
+ <tr>
+ <td>request.requestURI</td>
+ <td>
+ as returned by <a
+ href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServle…">getRequestURI()</a>
+ method
+ </td>
+ </tr>
+
+ <tr class="alt">
+ <td>request.userAgent</td>
+ <td>value of the "User-Agent" header
+ </td>
+ </tr>
+
+ </table>
+
+ <p>To install <code>MDCInsertingServletFilter</code> add the
+ following lines to your web-application's <em>web.xml</em> file</p>
+
+ <pre class="prettyprint source"><filter>
+ <filter-name>MDCInsertingServletFilter</filter-name>
+ <filter-class>
+ ch.qos.logback.classic.helpers.MDCInsertingServletFilter
+ </filter-class>
+</filter>
+<filter-mapping>
+ <filter-name>MDCInsertingServletFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+</filter-mapping> </pre>
+
+ <p><b>If your web-app has multiple filter, make sure that
+ <code>MDCInsertingServletFilter</code> is declared before other
+ filters.</b> For example, assuming the main processing in your
+ web-app is done in filter 'F', the MDC values set by
+ <code>MDCInsertingServletFilter</code> will not be seen by the code
+ invoked by 'F' if <code>MDCInsertingServletFilter</code> comes after
+ 'F'.
+ </p>
+
+ <p>Once the filter is installed, values corresponding to each MDC
+ key will be output by the %X <a
+ href="layouts.html#conversionWord">conversion word</a>.
+ </p>
<script src="../templates/footer.js" type="text/javascript"></script>
</div>
-----------------------------------------------------------------------
Summary of changes:
.../ch/qos/logback/classic/ClassicConstants.java | 9 ++-
.../classic/helpers/MDCInsertingServletFilter.java | 80 ++++++++++++++++++++
.../ch/qos/logback/classic/html/HTMLLayout.java | 16 ++++
.../selector/servlet/LoggerContextFilter.java | 12 +--
.../qos/logback/core/pattern/DynamicConverter.java | 2 +-
logback-site/src/site/pages/manual/mdc.html | 71 +++++++++++++++++-
6 files changed, 179 insertions(+), 11 deletions(-)
create mode 100644 logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
3
2

[JIRA] Created: (LBCORE-144) DatePatternToRegexTest fails when run with Polish locale
by Tomasz Nurkiewicz (JIRA) 17 Mar '10
by Tomasz Nurkiewicz (JIRA) 17 Mar '10
17 Mar '10
DatePatternToRegexTest fails when run with Polish locale
--------------------------------------------------------
Key: LBCORE-144
URL: http://jira.qos.ch/browse/LBCORE-144
Project: logback-core
Issue Type: Bug
Components: Rolling
Affects Versions: 0.9.18
Environment: Windows XP SP3, Polish
Reporter: Tomasz Nurkiewicz
Assignee: Logback dev list
Priority: Trivial
When ch.qos.logback.core.rolling.helper.DatePatternToRegexTest runs with Polish locale (pl_PL), dayInWeek test fails:
java.lang.AssertionError: [2009-wrz-Cz] does not match regex [\d{4}-.*-.{3,12}]
at org.junit.Assert.fail(Assert.java:74)
at org.junit.Assert.assertTrue(Assert.java:37)
at ch.qos.logback.core.rolling.helper.DatePatternToRegexTest.verify(DatePatternToRegexTest.java:98)
at ch.qos.logback.core.rolling.helper.DatePatternToRegexTest.doTest(DatePatternToRegexTest.java:82)
at ch.qos.logback.core.rolling.helper.DatePatternToRegexTest.doTest(DatePatternToRegexTest.java:86)
at ch.qos.logback.core.rolling.helper.DatePatternToRegexTest.dayInWeek(DatePatternToRegexTest.java:67)
Where "wrz" stands for "wrzesień" (Polish for September) and "Cz" for "Czwartek" (Thursday). "Cz" does not match '{3,12}' pattern produced by ch.qos.logback.core.rolling.helper.SequenceToRegex4SDF#toRegex method.
To reproduce use: -Duser.language=pl -Duser.region=PL JVM params.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
2
1

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-87-g1acd46c
by git-noreply@pixie.qos.ch 17 Mar '10
by git-noreply@pixie.qos.ch 17 Mar '10
17 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 1acd46c45fe243953ebebe85c20541b9a4b08e94 (commit)
from 91aaf870b3817646c125f7d571118f940bf58daf (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=1acd46c45fe243953ebebe85…
http://github.com/ceki/logback/commit/1acd46c45fe243953ebebe85c20541b9a4b08…
commit 1acd46c45fe243953ebebe85c20541b9a4b08e94
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Wed Mar 17 20:11:49 2010 +0100
Fix LBCORE-144
diff --git a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/SequenceToRegex4SDF.java b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/SequenceToRegex4SDF.java
index 60ebf70..950da47 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/SequenceToRegex4SDF.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/SequenceToRegex4SDF.java
@@ -58,7 +58,7 @@ class SequenceToRegex4SDF {
case 'S':
return number(occurrences);
case 'E':
- return ".{3,12}";
+ return ".{2,12}";
case 'a':
return ".{2}";
case 'z':
-----------------------------------------------------------------------
Summary of changes:
.../core/rolling/helper/SequenceToRegex4SDF.java | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[JIRA] Created: (LBCORE-143) ConsoleAppender should always write to current System.out / System.err. The underlying outputstream should not be bind statically.
by tomliliu (JIRA) 17 Mar '10
by tomliliu (JIRA) 17 Mar '10
17 Mar '10
ConsoleAppender should always write to current System.out / System.err. The underlying outputstream should not be bind statically.
----------------------------------------------------------------------------------------------------------------------------------
Key: LBCORE-143
URL: http://jira.qos.ch/browse/LBCORE-143
Project: logback-core
Issue Type: Bug
Components: Appender
Affects Versions: 0.9.18
Reporter: tomliliu
Assignee: Logback dev list
Attachments: ConsoleAppender.java
Hi logback-dev,
ConsoleAppender does not work nicely with JUnit.
Symptom: when running junit tests with logback (default configuration, no logback configuration is provided), only the first test case's output was captured, the subsequent test cases' output were not captured by junit.
The problem is that console appender binds itself to stdout / stderr statically.
Illustrate what happens:
Junit run test 1 -> System.out is set to test1.out -> Logback auto configure -> Console appender is bind to System.out, which is test1.out
Junit run test 2 -> System.out is set to test2.out -> Console appender is still bind to test1.out -> The output of subsequent test cases are not correctly redirected.
The ConsoleAppender's behavior is not correct as it should always write to current System.out / System.err.
I worked out a simple fix and hope it will be useful:
/**
* Logback: the generic, reliable, fast and flexible logging framework.
*
* Copyright (C) 2000-2009, 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;
import java.io.IOException;
import java.io.OutputStream;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.WarnStatus;
/**
* ConsoleAppender appends log events to <code>System.out</code> or <code>System.err</code> using a layout specified by
* the user. The default target is <code>System.out</code>.
*
* For more information about this appender, please refer to the online manual at
* http://logback.qos.ch/manual/appenders.html#ConsoleAppender
*
* @author Ceki Gülcü
*/
public class ConsoleAppender<E> extends WriterAppender<E> {
public static final String SYSTEM_OUT = "System.out";
public static final String SYSTEM_ERR = "System.err";
protected String target = SYSTEM_OUT;
private interface OutputStreamProvider {
OutputStream getOutputStream();
}
private static class SysoutProvider implements OutputStreamProvider {
@Override
public OutputStream getOutputStream() {
return System.out;
}
}
private static class SyserrProvider implements OutputStreamProvider {
@Override
public OutputStream getOutputStream() {
return System.err;
}
}
private static class WrapperOutputStream extends OutputStream {
private final OutputStreamProvider provider;
WrapperOutputStream(OutputStreamProvider provider) {
this.provider = provider;
}
@Override
public void write(int b) throws IOException {
provider.getOutputStream().write(b);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
provider.getOutputStream().write(b, off, len);
}
@Override
public void write(byte[] b) throws IOException {
provider.getOutputStream().write(b);
}
@Override
public void close() throws IOException {
provider.getOutputStream().close();
}
@Override
public void flush() throws IOException {
provider.getOutputStream().flush();
}
}
/**
* As in most logback components, the default constructor does nothing.
*/
public ConsoleAppender() {
}
/**
* Sets the value of the <b>Target</b> option. Recognized values are "System.out" and "System.err". Any other value
* will be ignored.
*/
public void setTarget(String value) {
String v = value.trim();
if (SYSTEM_OUT.equalsIgnoreCase(v)) {
target = SYSTEM_OUT;
} else if (SYSTEM_ERR.equalsIgnoreCase(v)) {
target = SYSTEM_ERR;
} else {
targetWarn(value);
}
}
/**
* Returns the current value of the <b>Target</b> property. The default value of the option is "System.out".
*
* See also {@link #setTarget}.
*/
public String getTarget() {
return target;
}
void targetWarn(String val) {
Status status = new WarnStatus("[" + val + " should be System.out or System.err.", this);
status.add(new WarnStatus("Using previously set target, System.out by default.", this));
addStatus(status);
}
public void start() {
if (target.equals(SYSTEM_OUT)) {
setWriter(createWriter(new WrapperOutputStream(new SysoutProvider())));
} else {
setWriter(createWriter(new WrapperOutputStream(new SyserrProvider())));
}
super.start();
}
/**
* This method overrides the parent {@link WriterAppender#closeWriter} implementation because the console stream is
* not ours to close.
*/
protected final void closeWriter() {
writeFooter();
}
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
3
16

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-86-g91aaf87
by git-noreply@pixie.qos.ch 17 Mar '10
by git-noreply@pixie.qos.ch 17 Mar '10
17 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 91aaf870b3817646c125f7d571118f940bf58daf (commit)
from e06bc4a748fea6af5e4878a5e411ea18d5a5fcdc (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=91aaf870b3817646c125f7d5…
http://github.com/ceki/logback/commit/91aaf870b3817646c125f7d571118f940bf58…
commit 91aaf870b3817646c125f7d571118f940bf58daf
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Wed Mar 17 19:29:31 2010 +0100
Applied Ruediger Dohna's patch contributed in
http://jira.qos.ch/browse/LBCORE-143
diff --git a/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java b/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
index 265d787..9946454 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
@@ -13,7 +13,6 @@
*/
package ch.qos.logback.core;
-import ch.qos.logback.core.helpers.ConsoleOutputStreamWrapper;
import ch.qos.logback.core.joran.spi.ConsoleTarget;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.WarnStatus;
@@ -28,33 +27,23 @@ import ch.qos.logback.core.status.WarnStatus;
*
* @author Ceki Gülcü
* @author Tom SH Liu
+ * @author Ruediger Dohna
*/
public class ConsoleAppender<E> extends OutputStreamAppender<E> {
- public static final String SYSTEM_OUT = "System.out";
- public static final String SYSTEM_ERR = "System.err";
protected ConsoleTarget target = ConsoleTarget.SystemOut;
/**
- * As in most logback components, the default constructor does nothing.
- */
- public ConsoleAppender() {
- }
-
- /**
* Sets the value of the <b>Target</b> option. Recognized values are
* "System.out" and "System.err". Any other value will be ignored.
*/
public void setTarget(String value) {
- String v = value.trim();
-
- if (SYSTEM_OUT.equalsIgnoreCase(v)) {
- target = ConsoleTarget.SystemOut;
- } else if (SYSTEM_ERR.equalsIgnoreCase(v)) {
- target = ConsoleTarget.SystemErr;
- } else {
+ ConsoleTarget t = ConsoleTarget.findByName(value.trim());
+ if (t == null) {
targetWarn(value);
+ } else {
+ target = t;
}
}
@@ -65,26 +54,18 @@ public class ConsoleAppender<E> extends OutputStreamAppender<E> {
* See also {@link #setTarget}.
*/
public String getTarget() {
- switch (target) {
- case SystemOut:
- return SYSTEM_OUT;
- case SystemErr:
- return SYSTEM_ERR;
- }
- throw new IllegalStateException("Unexpected target value ["+target+"]");
+ return target.getName();
}
- void targetWarn(String val) {
- Status status = new WarnStatus("[" + val
- + " should be System.out or System.err.", this);
- status.add(new WarnStatus(
- "Using previously set target, System.out by default.", this));
+ private void targetWarn(String val) {
+ Status status = new WarnStatus("[" + val + " should be in " + ConsoleTarget.values(), this);
+ status.add(new WarnStatus("Using previously set target, System.out by default.", this));
addStatus(status);
}
+ @Override
public void start() {
- setOutputStream(new ConsoleOutputStreamWrapper(target));
+ setOutputStream(target.getStream());
super.start();
}
-
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/helpers/ConsoleOutputStreamWrapper.java b/logback-core/src/main/java/ch/qos/logback/core/helpers/ConsoleOutputStreamWrapper.java
deleted file mode 100644
index ae53e03..0000000
--- a/logback-core/src/main/java/ch/qos/logback/core/helpers/ConsoleOutputStreamWrapper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * Logback: the reliable, generic, fast and flexible logging framework.
- * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
- *
- * This program and the accompanying materials are dual-licensed under either
- * the terms of the Eclipse Public License v1.0 as published by the Eclipse
- * Foundation
- *
- * or (per the licensee's choosing)
- *
- * under the terms of the GNU Lesser General Public License version 2.1 as
- * published by the Free Software Foundation.
- */
-package ch.qos.logback.core.helpers;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import ch.qos.logback.core.joran.spi.ConsoleTarget;
-
-/**
- * An {@link OutputStream} which always outputs to the current value of
- * System.out/System.err.
- *
- * @author Ceki Gülcü
- * @author Tom SH Liu
- */
-public class ConsoleOutputStreamWrapper extends OutputStream {
-
- ConsoleTarget consoleTarget;
-
- public ConsoleOutputStreamWrapper(ConsoleTarget consoleTarget) {
- this.consoleTarget = consoleTarget;
- }
-
- private OutputStream getOutputStream() {
- switch (consoleTarget) {
- case SystemOut:
- return System.out;
- case SystemErr:
- return System.err;
- }
- throw new IllegalStateException("Unpexpected consoleTarget value ["
- + consoleTarget + "]");
- }
-
- @Override
- public void write(int b) throws IOException {
- getOutputStream().write(b);
- }
-
- @Override
- public void write(byte b[]) throws IOException {
- this.write(b, 0, b.length);
- }
-
- @Override
- public void write(byte b[], int off, int len) throws IOException {
- getOutputStream().write(b, off, len);
- }
-
- @Override
- public void flush() throws IOException {
- getOutputStream().flush();
- }
-
- @Override
- public void close() throws IOException {
- // the console is not ours to close
- }
-}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/joran/spi/ConsoleTarget.java b/logback-core/src/main/java/ch/qos/logback/core/joran/spi/ConsoleTarget.java
index dfbcffb..ea9c30d 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/joran/spi/ConsoleTarget.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/joran/spi/ConsoleTarget.java
@@ -13,11 +13,62 @@
*/
package ch.qos.logback.core.joran.spi;
+import java.io.IOException;
+import java.io.OutputStream;
+
/**
* The set of console output targets.
*
* @author Ceki Gülcü
+ * @author Tom SH Liu
+ * @author Ruediger Dohna
*/
public enum ConsoleTarget {
- SystemOut, SystemErr;
+
+ SystemOut("System.out", new OutputStream() {
+ @Override
+ public void write(int b) throws IOException {
+ System.out.write(b);
+ }
+ @Override
+ public void flush() throws IOException {
+ System.out.flush();
+ }
+ }),
+
+ SystemErr("System.err", new OutputStream() {
+ @Override
+ public void write(int b) throws IOException {
+ System.err.write(b);
+ }
+ @Override
+ public void flush() throws IOException {
+ System.err.flush();
+ }
+ });
+
+ public static ConsoleTarget findByName(String name) {
+ for (ConsoleTarget target : ConsoleTarget.values()) {
+ if (target.name.equalsIgnoreCase(name)) {
+ return target;
+ }
+ }
+ return null;
+ }
+
+ private final String name;
+ private final OutputStream stream;
+
+ private ConsoleTarget(String name, OutputStream stream) {
+ this.name = name;
+ this.stream = stream;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public OutputStream getStream() {
+ return stream;
+ }
}
\ No newline at end of file
-----------------------------------------------------------------------
Summary of changes:
.../java/ch/qos/logback/core/ConsoleAppender.java | 41 +++--------
.../core/helpers/ConsoleOutputStreamWrapper.java | 71 --------------------
.../qos/logback/core/joran/spi/ConsoleTarget.java | 53 ++++++++++++++-
3 files changed, 63 insertions(+), 102 deletions(-)
delete mode 100644 logback-core/src/main/java/ch/qos/logback/core/helpers/ConsoleOutputStreamWrapper.java
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-85-ge06bc4a
by git-noreply@pixie.qos.ch 17 Mar '10
by git-noreply@pixie.qos.ch 17 Mar '10
17 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via e06bc4a748fea6af5e4878a5e411ea18d5a5fcdc (commit)
via 3ad9ae244a7db6233256d89f9513807f562cbdb2 (commit)
from 3faa7d8bc517251201915d2add3e2f86cc25a649 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=e06bc4a748fea6af5e4878a5…
http://github.com/ceki/logback/commit/e06bc4a748fea6af5e4878a5e411ea18d5a5f…
commit e06bc4a748fea6af5e4878a5e411ea18d5a5fcdc
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Wed Mar 17 17:44:30 2010 +0100
- SiftingAppender now exposes its AppenderTracker. Moreover, the
stopAndRemoveNow(String key) method was added to AppenderTracker,
allowing immediate removal of a nested appender.
- minor editing of the manual
diff --git a/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderTracker.java b/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderTracker.java
index de3cea3..6e75c85 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderTracker.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderTracker.java
@@ -27,6 +27,5 @@ public interface AppenderTracker<E> {
void stopStaleAppenders(long timestamp);
List<String> keyList();
List<Appender<E>> valueList();
-
-
+ void stopAndRemoveNow(String key);
}
\ No newline at end of file
diff --git a/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderTrackerImpl.java b/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderTrackerImpl.java
index e6ef0f7..4697b55 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderTrackerImpl.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderTrackerImpl.java
@@ -74,6 +74,28 @@ public class AppenderTrackerImpl<E> implements AppenderTracker<E> {
}
}
+ /**
+ * @since 0.9.19
+ * @param key
+ */
+ public synchronized void stopAndRemoveNow(String key) {
+ Entry e = head;
+ Entry found = null;
+ while (e != tail) {
+ if(key.equals(e.key)) {
+ found = e;
+ break;
+ }
+ e = e.next;
+ }
+ if(found != null) {
+ rearrangePreexistingLinks(e);
+ map.remove(key);
+ Appender appender = e.value;
+ appender.stop();
+ }
+ }
+
public List<String> keyList() {
List<String> result = new LinkedList<String>();
Entry e = head;
diff --git a/logback-core/src/test/java/ch/qos/logback/core/sift/AppenderTrackerTest.java b/logback-core/src/test/java/ch/qos/logback/core/sift/AppenderTrackerTest.java
index 85af51a..e82a83e 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/sift/AppenderTrackerTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/sift/AppenderTrackerTest.java
@@ -31,6 +31,7 @@ public class AppenderTrackerTest {
Context context = new ContextBase();
AppenderTracker<Object> appenderTracker = new AppenderTrackerImpl<Object>();
ListAppender<Object> la = new ListAppender<Object>();
+ String key = "a";
@Before
public void setUp() {
@@ -49,26 +50,31 @@ public class AppenderTrackerTest {
@Test
public void empty1() {
long now = 3000;
- assertNull(appenderTracker.get("a", now++));
+ assertNull(appenderTracker.get(key, now++));
now += AppenderTrackerImpl.THRESHOLD+1000;
appenderTracker.stopStaleAppenders(now);
- assertNull(appenderTracker.get("a", now++));
+ assertNull(appenderTracker.get(key, now++));
}
@Test
public void smoke() {
assertTrue(la.isStarted());
long now = 3000;
- appenderTracker.put("a", la, now);
- assertEquals(la, appenderTracker.get("a", now++));
+ appenderTracker.put(key, la, now);
+ assertEquals(la, appenderTracker.get(key, now++));
now += AppenderTrackerImpl.THRESHOLD+1000;
appenderTracker.stopStaleAppenders(now);
assertFalse(la.isStarted());
- assertNull(appenderTracker.get("a", now++));
+ assertNull(appenderTracker.get(key, now++));
}
-
+
@Test
- public void scenarioBased() {
-
- }
+ public void removeNow() {
+ long now = 3000;
+ appenderTracker.put(key, la, now);
+ appenderTracker.stopAndRemoveNow(key);
+ assertFalse(la.isStarted());
+ appenderTracker.get(key, now++);
+ assertNull(appenderTracker.get(key, now++));
+ }
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/sift/PackageTest.java b/logback-core/src/test/java/ch/qos/logback/core/sift/PackageTest.java
index 28af860..2446b02 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/sift/PackageTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/sift/PackageTest.java
@@ -18,6 +18,6 @@ import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
-(a)SuiteClasses({ScenarioBasedAppenderTrackerTest.class})
+(a)SuiteClasses({AppenderTrackerTest.class, ScenarioBasedAppenderTrackerTest.class})
public class PackageTest {
}
\ No newline at end of file
diff --git a/logback-core/src/test/java/ch/qos/logback/core/sift/ScenarioBasedAppenderTrackerTest.java b/logback-core/src/test/java/ch/qos/logback/core/sift/ScenarioBasedAppenderTrackerTest.java
index 6f21a1e..8a2e038 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/sift/ScenarioBasedAppenderTrackerTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/sift/ScenarioBasedAppenderTrackerTest.java
@@ -22,34 +22,52 @@ public class ScenarioBasedAppenderTrackerTest {
Simulator simulator;
+ int INVERSE_OF_NO_REMOVE = Integer.MAX_VALUE;
+
+
void verify() {
- AppenderTracker at = simulator.appenderTracker;
+ AppenderTracker at = simulator.realAppenderTracker;
AppenderTracker t_at = simulator.t_appenderTracker;
- //List<String> resultKeys = at.keyList();
- //List<String> witnessKeys = t_at.keyList();
assertEquals(t_at.keyList(), at.keyList());
}
-
+
@Test
public void shortTest() {
- simulator = new Simulator(20, AppenderTracker.THRESHOLD / 2);
+ simulator = new Simulator(20, AppenderTracker.THRESHOLD / 2, INVERSE_OF_NO_REMOVE);
simulator.buildScenario(200);
simulator.simulate();
verify();
}
+
+ @Test
+ public void shortTestWithRemovals() {
+ simulator = new Simulator(10, AppenderTracker.THRESHOLD / 10, 2);
+ simulator.buildScenario(200);
+ simulator.simulate();
+ verify();
+ }
+
@Test
public void mediumTest() {
- simulator = new Simulator(100, AppenderTracker.THRESHOLD / 2);
+ simulator = new Simulator(100, AppenderTracker.THRESHOLD / 2, INVERSE_OF_NO_REMOVE);
simulator.buildScenario(20000);
simulator.simulate();
verify();
}
@Test
+ public void mediumTestWithRemovals() {
+ simulator = new Simulator(10, AppenderTracker.THRESHOLD / 100, 2);
+ simulator.buildScenario(20000);
+ simulator.simulate();
+ verify();
+ }
+
+ @Test
@Ignore
- public void longetTest() {
- simulator = new Simulator(100, AppenderTracker.THRESHOLD / 200);
+ public void longTest() {
+ simulator = new Simulator(100, AppenderTracker.THRESHOLD / 200, 10);
simulator.buildScenario(2000000);
simulator.simulate();
verify();
diff --git a/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java b/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java
index 16cf0f0..db91d02 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java
@@ -23,16 +23,17 @@ import ch.qos.logback.core.Appender;
import ch.qos.logback.core.appender.NOPAppender;
import ch.qos.logback.core.sift.tracker.AppenderTrackerTImpl;
import ch.qos.logback.core.sift.tracker.SimulationEvent;
+import ch.qos.logback.core.sift.tracker.SimulationEvent.SimEventType;
/**
- * Simulate use of AppenderTracker by HoardAppender.
+ * Simulate use of AppenderTracker by SiftingAppender.
*
* @author ceki
- *
+ *
*/
public class Simulator {
- AppenderTrackerImpl<Object> appenderTracker = new AppenderTrackerImpl<Object>();
+ AppenderTrackerImpl<Object> realAppenderTracker = new AppenderTrackerImpl<Object>();
AppenderTrackerTImpl t_appenderTracker = new AppenderTrackerTImpl();
List<String> keySpace = new ArrayList<String>();
@@ -42,10 +43,11 @@ public class Simulator {
Random random = new Random(11234);
final int maxTimestampInc;
- long timestamp = 30000;
+ final int inverseOfRemoveProbability;
- Simulator(int keySpaceLen, int maxTimestampInc) {
+ Simulator(int keySpaceLen, int maxTimestampInc, int inverseOfRemoveProbability) {
this.maxTimestampInc = maxTimestampInc;
+ this.inverseOfRemoveProbability = inverseOfRemoveProbability;
Map<String, String> checkMap = new HashMap<String, String>();
for (int i = 0; i < keySpaceLen; i++) {
String k = getRandomKeyStr();
@@ -66,31 +68,65 @@ public class Simulator {
}
void buildScenario(int simLen) {
+ long timestamp = 30000;
int keySpaceLen = keySpace.size();
for (int i = 0; i < simLen; i++) {
int index = random.nextInt(keySpaceLen);
timestamp += random.nextInt(maxTimestampInc);
String key = keySpace.get(index);
- scenario.add(new SimulationEvent(key, timestamp));
+ SimEventType eventType = SimEventType.PUT;
+
+ int removeNow = random.nextInt(inverseOfRemoveProbability);
+ if (removeNow == 0) {
+ eventType = SimEventType.REMOVE_NOW;
+ }
+ scenario.add(new SimulationEvent(eventType, key, timestamp));
+ }
+ }
+
+ void dump() {
+ for (SimulationEvent simeEvent : scenario) {
+ System.out.println(simeEvent);
}
}
public void simulate() {
for (SimulationEvent simeEvent : scenario) {
- play(simeEvent, appenderTracker);
+ play(simeEvent, realAppenderTracker);
play(simeEvent, t_appenderTracker);
}
}
void play(SimulationEvent simulationEvent,
AppenderTracker<Object> appenderTracker) {
- String mdcValue = simulationEvent.key;
+ String key = simulationEvent.key;
long timestamp = simulationEvent.timestamp;
- Appender<Object> appender = appenderTracker.get(mdcValue, timestamp);
+
+ switch (simulationEvent.simEventType) {
+ case PUT:
+ doPut(appenderTracker, key, timestamp);
+ break;
+ case REMOVE_NOW:
+ doRemoveNow(appenderTracker, key);
+ break;
+ }
+
+ }
+
+ void doPut(AppenderTracker<Object> appenderTracker, String key, long timestamp) {
+ Appender<Object> appender = appenderTracker.get(key, timestamp);
if (appender == null) {
appender = new NOPAppender<Object>();
- appenderTracker.put(mdcValue, appender, timestamp);
+ appenderTracker.put(key, appender, timestamp);
}
appenderTracker.stopStaleAppenders(timestamp);
}
+
+ int i = 0;
+
+ void doRemoveNow(AppenderTracker<Object> appenderTracker, String key) {
+ // System.out.println("doRemoveNow "+(i++));
+ appenderTracker.stopAndRemoveNow(key);
+ }
+
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/sift/tracker/AppenderTrackerTImpl.java b/logback-core/src/test/java/ch/qos/logback/core/sift/tracker/AppenderTrackerTImpl.java
index 1a33637..3b8e546 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/sift/tracker/AppenderTrackerTImpl.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/sift/tracker/AppenderTrackerTImpl.java
@@ -70,6 +70,20 @@ public class AppenderTrackerTImpl implements AppenderTracker<Object> {
}
}
+ synchronized public void stopAndRemoveNow(String key) {
+ TEntry found = null;
+ for (TEntry te : entryList) {
+ if (key.equals(te.key)) {
+ found = te;
+ break;
+ }
+ }
+ if (found != null) {
+ entryList.remove(found);
+ }
+
+ }
+
final private boolean isEntryStale(TEntry entry, long now) {
return ((entry.timestamp + THRESHOLD) < now);
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/sift/tracker/SimulationEvent.java b/logback-core/src/test/java/ch/qos/logback/core/sift/tracker/SimulationEvent.java
index b04e52f..09ae7c1 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/sift/tracker/SimulationEvent.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/sift/tracker/SimulationEvent.java
@@ -16,15 +16,21 @@ package ch.qos.logback.core.sift.tracker;
public class SimulationEvent {
- public String key;
- public long timestamp;
-
- public SimulationEvent(String key, long timestamp) {
+ public enum SimEventType {
+ PUT, REMOVE_NOW;
+ }
+
+ final public String key;
+ final public long timestamp;
+ final public SimEventType simEventType;
+
+ public SimulationEvent(SimEventType simEventType, String key, long timestamp) {
+ this.simEventType = simEventType;
this.key = key;
this.timestamp = timestamp;
}
public String toString() {
- return "Event: k=" + key +", timestamp=" + timestamp;
+ return "Type: "+simEventType+", Event: k=" + key +", timestamp=" + timestamp;
}
}
diff --git a/logback-site/src/site/pages/manual/introduction.html b/logback-site/src/site/pages/manual/introduction.html
index 45748ec..ed1b347 100644
--- a/logback-site/src/site/pages/manual/introduction.html
+++ b/logback-site/src/site/pages/manual/introduction.html
@@ -23,7 +23,7 @@
</div>
<div id="content">
- <h1>Introduction</h1>
+ <h1>Chapter 1: Introduction</h1>
<div class="quote">
<p><em> The morale effects are startling. Enthusiasm jumps when
diff --git a/logback-site/src/site/pages/manual/jmxConfig.html b/logback-site/src/site/pages/manual/jmxConfig.html
index 91c4c0e..e56f951 100644
--- a/logback-site/src/site/pages/manual/jmxConfig.html
+++ b/logback-site/src/site/pages/manual/jmxConfig.html
@@ -25,7 +25,7 @@
</div>
<div id="content">
- <h2>Chapter 10: JMX Configurator</h2>
+ <h1>Chapter 10: JMX Configurator</h1>
<p>As its name indicates, <code>JMXConfigurator</code> allows
configuration of logback via JMX. In a nutshell, it lets you
diff --git a/logback-site/src/site/pages/manual/loggingSeparation.html b/logback-site/src/site/pages/manual/loggingSeparation.html
index ecea848..d366182 100644
--- a/logback-site/src/site/pages/manual/loggingSeparation.html
+++ b/logback-site/src/site/pages/manual/loggingSeparation.html
@@ -23,7 +23,7 @@
</div>
<div id="content">
- <h2>Chapter 9: Logging separation</h2>
+ <h1>Chapter 9: Logging separation</h1>
<div class="quote">
<p><em>It is not knowledge, but the act of learning, not
diff --git a/logback-site/src/site/pages/manual/migrationFromLog4j.html b/logback-site/src/site/pages/manual/migrationFromLog4j.html
index dd392cf..d34f043 100644
--- a/logback-site/src/site/pages/manual/migrationFromLog4j.html
+++ b/logback-site/src/site/pages/manual/migrationFromLog4j.html
@@ -23,7 +23,7 @@
</div>
<div id="content">
- <h2>Chapter 12: Migration from log4j</h2>
+ <h1>Chapter 12: Migration from log4j</h1>
<div class="quote">
<p><em>The more things change, the more they remain the
diff --git a/logback-site/src/site/pages/manual/onJoran.html b/logback-site/src/site/pages/manual/onJoran.html
index 9c6f259..84d3395 100644
--- a/logback-site/src/site/pages/manual/onJoran.html
+++ b/logback-site/src/site/pages/manual/onJoran.html
@@ -23,7 +23,7 @@
</div>
<div id="content">
- <h2>Chapter 11: Joran</h2>
+ <h1>Chapter 11: Joran</h1>
<div class="quote">
<p><em>The answer, my friend, is blowin' in the wind, The answer
diff --git a/logback-site/src/site/pages/news.html b/logback-site/src/site/pages/news.html
index 1deacc2..b6b13a3 100644
--- a/logback-site/src/site/pages/news.html
+++ b/logback-site/src/site/pages/news.html
@@ -69,9 +69,9 @@
</p>
<p>Fixed <a
- href="http://jira.qos.ch/browse/LBCLASSIC-193">LBCLASSIC-193</a>. <code>SyslogAppender</code>
- will no longer shutdown when messages over 256Kb cause an
- <code>IOException</code>.
+ href="http://jira.qos.ch/browse/LBCLASSIC-193">LBCLASSIC-193</a>.
+ <code>SyslogAppender</code> will no longer shutdown when messages
+ over 256Kb cause an <code>IOException</code>.
</p>
<p>Added <a
@@ -97,10 +97,17 @@
surrounding child elements is ignored.
</p>
+ <p><code>SiftingAppender</code> now exposes its
+ <code>AppenderTracker</code>. Moreover, the
+ <code>stopAndRemoveNow(String key)</code> method was added to
+ <code>AppenderTracker</code>, allowing immediate removal of a
+ nested appender.
+ </p>
<p>Fixed <a
- href="http://jira.qos.ch/browse/LBCORE-130">LBCORE-130</a>. <code>FileNamePattern</code>
- no longer treats parenthesis as special.
+ href="http://jira.qos.ch/browse/LBCORE-130">LBCORE-130</a>.
+ <code>FileNamePattern</code> no longer treats parenthesis as
+ special.
</p>
<p>The <span class="option">CharsetEncoder</span> property in
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=3ad9ae244a7db6233256d89f…
http://github.com/ceki/logback/commit/3ad9ae244a7db6233256d89f9513807f562cb…
commit 3ad9ae244a7db6233256d89f9513807f562cbdb2
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Wed Mar 17 14:40:26 2010 +0100
- added getAppenderTracer method in SiftingAppender
- the contextName attribute in jmxConfigurator is redundant since the
context name can be set with the <contextName> element. Modified
documentation accordingly. This change was triggered by comments made
by Matthias Kretschmar.
diff --git a/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java
index 82c15e0..dbfe217 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java
@@ -81,7 +81,8 @@ public abstract class SiftingAppenderBase<E> extends
appenderTracker.put(discriminatingValue, appender, timestamp);
}
} catch (JoranException e) {
- addError("Failed to build appender for [" + discriminatingValue + "]", e);
+ addError("Failed to build appender for [" + discriminatingValue + "]",
+ e);
return;
}
}
@@ -97,9 +98,20 @@ public abstract class SiftingAppenderBase<E> extends
this.discriminator = discriminator;
}
-
+ // sometime one needs to close a nested appender immediately
+ // for example when executing a command which has its own nested appender
+ // and the command also cleans up after itself. However, an open file appender
+ // will prevent the folder from being deleted
+ // see http://www.qos.ch/pipermail/logback-user/2010-March/001487.html
+ /**
+ * @since 0.9.19
+ */
+ public AppenderTracker getAppenderTracer() {
+ return appenderTracker;
+ }
+
public String getDiscriminatorKey() {
- if(discriminator != null) {
+ if (discriminator != null) {
return discriminator.getKey();
} else {
return null;
diff --git a/logback-site/src/site/pages/manual/jmxConfig.html b/logback-site/src/site/pages/manual/jmxConfig.html
index 5481188..91c4c0e 100644
--- a/logback-site/src/site/pages/manual/jmxConfig.html
+++ b/logback-site/src/site/pages/manual/jmxConfig.html
@@ -155,11 +155,10 @@ public class MyContextListener implements ServletContextListener {
web-applications will collide.
</p>
- <p>To avoid such undesirable collisions, you can instruct each
- <code>JMXConfigurator</code> instance to have a different name by
- setting the "contextName" attribute of the
- <code><jmxConfigurator></code> element in the logback
- configuration file.
+ <p>To avoid such undesirable collisions, you simply <a
+ href="configuration.html#contextName">set the name of your
+ application's logging context</a> and <code>JMXConfigurator</code>
+ will automatically use the name you have set.
</p>
<p>For example, if you deploy two web-applications named "Koala"
@@ -167,11 +166,19 @@ public class MyContextListener implements ServletContextListener {
configuration
</p>
- <p class="source"><jmxConfigurator <b>contextName="Koala"</b> /></p>
+ <pre class="prettyprint source"><configuration>
+ <b><contextName>Koala</contextName></b>
+ <jmxConfigurator/>
+ ...
+<configuration></pre>
<p>and in Wombat logback configuration file, you would write:</p>
- <p class="source"><jmxConfigurator <b>contextName="Womcat"</b> /></p>
+ <pre class="prettyprint source"><configuration>
+ <b><contextName>Wombat</contextName></b>x
+ <jmxConfigurator/>
+ ...
+<configuration></pre>
<p>In jconsole's MBeans panel, you would two distinct
<code>JMXConfigurator</code> instances:</p>
-----------------------------------------------------------------------
Summary of changes:
.../ch/qos/logback/core/sift/AppenderTracker.java | 3 +-
.../qos/logback/core/sift/AppenderTrackerImpl.java | 22 ++++++++
.../qos/logback/core/sift/SiftingAppenderBase.java | 18 +++++-
.../qos/logback/core/sift/AppenderTrackerTest.java | 24 +++++---
.../java/ch/qos/logback/core/sift/PackageTest.java | 2 +-
.../sift/ScenarioBasedAppenderTrackerTest.java | 34 +++++++++---
.../java/ch/qos/logback/core/sift/Simulator.java | 56 ++++++++++++++++----
.../core/sift/tracker/AppenderTrackerTImpl.java | 14 +++++
.../logback/core/sift/tracker/SimulationEvent.java | 16 ++++--
.../src/site/pages/manual/introduction.html | 2 +-
logback-site/src/site/pages/manual/jmxConfig.html | 23 +++++---
.../src/site/pages/manual/loggingSeparation.html | 2 +-
.../src/site/pages/manual/migrationFromLog4j.html | 2 +-
logback-site/src/site/pages/manual/onJoran.html | 2 +-
logback-site/src/site/pages/news.html | 17 ++++--
15 files changed, 182 insertions(+), 55 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0