MDC

来源:互联网 发布:进销存软件excel表格 编辑:程序博客网 时间:2024/05/29 15:52
/** * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included  with this distribution in * the LICENSE.txt file. */package org.apache.log4j;import java.util.Hashtable;import org.apache.log4j.helpers.Loader;import org.apache.log4j.helpers.ThreadLocalMap;/***   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 {    final static MDC mdc = new MDC();    static final int HT_SIZE = 7;  boolean java1;    Object tlm;    private  MDC() {    java1 = Loader.isJava1();    if(!java1) {      tlm = new ThreadLocalMap();    }  }  /***     Put a context value (the <code>o</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.       */  static  public  void put(String key, Object o) {    mdc.put0(key, o);  }    /***     Get the context identified by the <code>key</code> parameter.     <p>This method has no side effects.   */  static   public  Object get(String key) {    return mdc.get0(key);  }  /***     Remove the the context identified by the <code>key</code>     parameter.  */  static   public  void remove(String key) {    mdc.remove0(key);  }  /***   * Get the current thread's MDC as a hashtable. This method is   * intended to be used internally.     * */  public static Hashtable getContext() {    return mdc.getContext0();  }  private  void put0(String key, Object o) {    if(java1) {      return;    } else {      Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();      if(ht == null) {        ht = new Hashtable(HT_SIZE);        ((ThreadLocalMap)tlm).set(ht);      }          ht.put(key, o);    }  }    private  Object get0(String key) {    if(java1) {      return null;    } else {             Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();      if(ht != null && key != null) {        return ht.get(key);      } else {        return null;      }    }  }  private  void remove0(String key) {    if(!java1) {      Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();      if(ht != null) {        ht.remove(key);      }     }  }  private  Hashtable getContext0() {     if(java1) {      return null;    } else {             return (Hashtable) ((ThreadLocalMap)tlm).get();    }  }}