
Hello Ralph, The issue was broached in August[1]. While I agree that MDCInsertingServletFilter will often need to be modified, it will improve over time so the current version serves as a starting point. Moreover, it can also help users write their own filters, again as a starting point. Yes, MDCInsertingServletFilter is far far from being perfect but it'll hopefully improve over time. [1] http://www.qos.ch/pipermail/logback-user/2009-August/001249.html On 18/03/2010 1:26 AM, Ralph Goers wrote:
I thought we discussed this. Putting this class into classic is pointless as it will almost never be used as is. It belongs in examples as it is a good starting point. For example, you could have included the ipAddress and current host name as shown at http://www.slf4j.org/extensions.html#event_logger.
Ralph
On Mar 17, 2010, at 4:24 PM, added by portage for gitosis-gentoo wrote:
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=8e4097f3a23fc9ddc57846ad5... http://github.com/ceki/logback/commit/8e4097f3a23fc9ddc57846ad55e5c7100d2a4a...
commit 8e4097f3a23fc9ddc57846ad55e5c7100d2a4a63 Author: Ceki Gulcu<ceki@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.html#getRemoteHost%28%29">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/HttpServletRequest.html#getRequestURI%28%29">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. _______________________________________________ logback-dev mailing list logback-dev@qos.ch http://qos.ch/mailman/listinfo/logback-dev
_______________________________________________ logback-dev mailing list logback-dev@qos.ch http://qos.ch/mailman/listinfo/logback-dev