svn commit: r523 - in logback/trunk: . logback-classic/src/main/java/ch/qos/logback/classic logback-classic/src/test/java/ch/qos/logback/classic logback-core/src/main/java/ch/qos/logback/core/rolling logback-core/src/main/java/ch/qos/logback/core/rolling/helper logback-site/src/site/fml

Author: ceki Date: Thu Sep 7 21:07:49 2006 New Revision: 523 Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/MDC.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/MDCTest.java logback/trunk/logback-site/src/site/fml/ logback/trunk/logback-site/src/site/fml/codes.fml Modified: logback/trunk/ (props changed) logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/RollingCalendar.java Log: Added MDC support Minor bug fixes Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/MDC.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/MDC.java Thu Sep 7 21:07:49 2006 @@ -0,0 +1,105 @@ +package ch.qos.logback.classic; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * A <em>Mapped Diagnostic Context</em>, or MDC in short, is an instrument for + * distinguishing interleaved log output from different sources. Log output is + * typically interleaved when a server handles multiple clients + * near-simultaneously. + * <p> + * <b><em>The MDC is managed on a per thread basis</em></b>. A child thread + * automatically inherits a <em>copy</em> of the mapped diagnostic context of + * its parent. + * <p> + * + * @author Ceki Gülcü + */ +public class MDC { + private static final ThreadLocal<HashMap<String, String>> threadLocal = new ThreadLocal<HashMap<String, String>>(); + + private MDC() { + } + + /** + * Put a context value (the <code>val</code> parameter) as identified with + * the <code>key</code> parameter into the current thread's context map. + * + * <p> + * If the current thread does not have a context map it is created as a side + * effect of this call. + */ + public static void put(String key, String val) { + HashMap<String, String> hashMap = threadLocal.get(); + + if (hashMap == null) { + hashMap = new HashMap<String, String>(); + threadLocal.set(hashMap); + } + + hashMap.put(key, val); + } + + /** + * Get the context identified by the <code>key</code> parameter. + * + * <p> + * This method has no side effects. + */ + public static String get(String key) { + HashMap<String, String> hashMap = threadLocal.get(); + + if ((hashMap != null) && (key != null)) { + return hashMap.get(key); + } else { + return null; + } + } + + /** + * Remove the the context identified by the <code>key</code> parameter. + */ + public static void remove(String key) { + HashMap<String, String> hashMap = threadLocal.get(); + + if (hashMap != null) { + hashMap.remove(key); + } + } + + /** + * Clear all entries in the MDC. + */ + public static void clear() { + HashMap<String, String> hashMap = threadLocal.get(); + + if (hashMap != null) { + hashMap.clear(); + threadLocal.remove(); + } + } + + /** + * Get the current thread's MDC as a map. This method is intended to be used + * internally. + */ + public static Map<String, String> getContext() { + return threadLocal.get(); + } + + /** + * Returns the keys in the MDC as a {@link Set}. The returned value + * can be null. + */ + public static Set<String> getKeys() { + HashMap<String, String> hashMap = threadLocal.get(); + + if (hashMap != null) { + return hashMap.keySet(); + } else { + return null; + } + } +} Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/MDCTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/MDCTest.java Thu Sep 7 21:07:49 2006 @@ -0,0 +1,49 @@ +package ch.qos.logback.classic; + +import junit.framework.TestCase; + +public class MDCTest extends TestCase { + + + public void test() throws InterruptedException { + TestThread threadA = new TestThread("a"); + threadA.start(); + + TestThread threadB = new TestThread("b"); + threadB.start(); + + threadA.join(); + threadB.join(); + + + assertNull(threadA.x0); + assertEquals("a", threadA.x1); + assertNull(threadA.x2); + + assertNull(threadB.x0); + assertEquals("b", threadB.x1); + assertNull(threadB.x2); + + } + +} + +class TestThread extends Thread { + + String val; + TestThread(String val) { + this.val = val; + } + String x0; + String x1; + String x2; + + public void run() { + x0 = MDC.get("x"); + MDC.put("x", val); + x1 = MDC.get("x"); + MDC.clear(); + x2 = MDC.get("x"); + System.out.println("Exiting "+val); + } +} \ No newline at end of file Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.java Thu Sep 7 21:07:49 2006 @@ -123,7 +123,7 @@ static final String FNP_NOT_SET = "The FileNamePattern option must be set before using TimeBasedRollingPolicy. "; static final String SEE_FNP_NOT_SET = - "See also http://www.logback.com/doc/codes.html#tbr_fnp_not_set"; + "See also http://logback.qos.ch/doc/codes.html#tbr_fnp_not_set"; RollingCalendar rc; long nextCheck; Date lastCheck = new Date(); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/RollingCalendar.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/RollingCalendar.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/RollingCalendar.java Thu Sep 7 21:07:49 2006 @@ -201,6 +201,7 @@ case TOP_OF_WEEK: this.set(Calendar.DAY_OF_WEEK, getFirstDayOfWeek()); this.set(Calendar.HOUR_OF_DAY, 0); + this.set(Calendar.MINUTE, 0); this.set(Calendar.SECOND, 0); this.set(Calendar.MILLISECOND, 0); this.add(Calendar.WEEK_OF_YEAR, 1); @@ -210,6 +211,7 @@ case TOP_OF_MONTH: this.set(Calendar.DATE, 1); this.set(Calendar.HOUR_OF_DAY, 0); + this.set(Calendar.MINUTE, 0); this.set(Calendar.SECOND, 0); this.set(Calendar.MILLISECOND, 0); this.add(Calendar.MONTH, 1); Added: logback/trunk/logback-site/src/site/fml/codes.fml ============================================================================== --- (empty file) +++ logback/trunk/logback-site/src/site/fml/codes.fml Thu Sep 7 21:07:49 2006 @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="iso-8859-1"?> + +<document> + + <body> + + <faqs title="Logback error messages and their meanings"> + + <part id="Generalities"> + <title>Generalities</title> + + <faq id="tbr_fnp_not_set"> + + <question>The <b>FileNamePattern</b> option must be set before + using <code>TimeBasedRollingPolicy</code> or + <code>FixedWindowRollingPolicy</code>. + </question> + + <answer> + <p>The <b>FileNamePattern</b> option for both + <code>TimeBasedRollingPolicy</code> and + <code>FixedWindowRollingPolicy</code> is mandatory. + </p> + </answer> + + </faq> + </part> + </faqs> + </body> +</document>
participants (1)
-
noreply.ceki@qos.ch