| /* |
| * Copyright 1999,2004 The Apache Software Foundation. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.log4j; |
| |
| import org.apache.log4j.helpers.ThreadLocalMap; |
| |
| import java.util.Enumeration; |
| import java.util.Hashtable; |
| |
| |
| /** |
| The MDC class is similar to the {@link NDC} class except that it is |
| based on a map instead of a stack. It provides <em>mapped |
| diagnostic contexts</em>. 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>The MDC class requires JDK 1.2 or above. Under JDK 1.1 the MDC |
| will always return empty values but otherwise will not affect or |
| harm your application. |
| |
| @since 1.2 |
| |
| @author Ceki Gülcü */ |
| public class MDC { |
| static final int HT_SIZE = 7; |
| private static final ThreadLocalMap tlm = new ThreadLocalMap(); |
| |
| 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. |
| * */ |
| public static void put(String key, String val) { |
| Hashtable ht = (Hashtable) tlm.get(); |
| |
| if (ht == null) { |
| ht = new Hashtable(HT_SIZE); |
| tlm.set(ht); |
| } |
| |
| ht.put(key, val); |
| } |
| |
| /** |
| * Please use the {@link #put(String key, String val)} form instead. The 'val' |
| * parameter needs to be a string. |
| * |
| * @param key the key for the contextual information |
| * @param val is transformed into a string before being placed in the MDC |
| * @deprecated please use the {@link #put(String key, String val)} form. |
| */ |
| public static void put(String key, Object val) { |
| put(key, val.toString()); |
| } |
| |
| /** |
| * Get the context identified by the <code>key</code> parameter. |
| * |
| * <p>This method has no side effects. |
| * */ |
| public static String get(String key) { |
| Hashtable ht = (Hashtable) tlm.get(); |
| |
| if ((ht != null) && (key != null)) { |
| return (String) ht.get(key); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Remove the the context identified by the <code>key</code> |
| * parameter. */ |
| public static void remove(String key) { |
| Hashtable ht = (Hashtable) tlm.get(); |
| |
| if (ht != null) { |
| ht.remove(key); |
| } |
| } |
| |
| /** |
| * Clear all entries in the MDC. |
| * @since 1.3 |
| */ |
| public static void clear() { |
| Hashtable ht = (Hashtable) tlm.get(); |
| |
| if (ht != null) { |
| ht.clear(); |
| } |
| } |
| |
| /** |
| * Get the current thread's MDC as a hashtable. This method is |
| * intended to be used internally. |
| * */ |
| public static Hashtable getContext() { |
| return (Hashtable) tlm.get(); |
| } |
| |
| /** |
| * Returns the keys in the MDC as an {@link Enumeration}. The returned value can be |
| * null. |
| * |
| * @since version 1.3 |
| */ |
| public static Enumeration getKeys() { |
| Hashtable ht = (Hashtable) tlm.get(); |
| |
| if (ht != null) { |
| return ht.keys(); |
| } else { |
| return null; |
| } |
| } |
| } |