利用ThreadLocal記錄日誌

   在項目中記錄日誌是必須的,但是往往在記錄日誌的時候都是通過logger.debug("...")來記錄的,程序一邊運行一邊記錄日誌,尤其在多線程或者Web應用中,同一時間可能有不同的日誌記錄到同一個文件中去,當出現錯誤的時候就不能確定在那些信息是你想關心的.因此如果我們在一個程序的開始的地方開始記錄日誌,但是這個日誌不記錄到日誌文件中,而是保存在一個ThreadLocal中,在出錯的時候就可以將這些日誌全部輸出到日誌文件中去,就能方便查找了.
代碼如下:
 
 
import java.util.ArrayList;
import java.util.List;
public class DebugLogger {
 /**
  * @param args
  */
 public static void main(String[] args) {
  //測試使用,正式使用的時候可以在一個方法的開始new一個DebugLogger 
  DebugLogger logger = new DebugLogger();
  //模擬需要記錄的十次日誌信息,一次記錄到DebugLogger裏面去了
  for(int i = 0;i<10;i++){
  //在需要記錄日誌的地方改爲下面的代碼
   logger.put("Log info " + i);
  }
  
 
 //到了方法結束或者出現異常的時候,將剛纔記錄的日誌取出來
  String[] strings = logger.get();
 //將取出來的日誌一次記錄到日誌文件裏去
  for (int i = 0; i < strings.length; i++) {
   System.out.println(strings[i]);
  }
  
 //請空DebugLogger裏記錄的日誌內容
  logger.clear();
  {
   String[] strings1 = logger.get();
   for (int i = 0; i < strings1.length; i++) {
    System.out.println(strings1[i]);
   }
   
  }
 }
 
 //內部靜態類,繼承至ThreadLocal
 private static class ThreadLocalList extends ThreadLocal {
 // 在調用get()方法的時候返回一個ArrayList對象
  public Object initialValue() {
   return new ArrayList();
  }
  //將保存在ThreadLocal中的List返回
  public List getList() {
   return (List) super.get();
  }
 }
 
 private ThreadLocalList list = new ThreadLocalList();
 private static String[] stringArray = new String[0];
 //清空記錄的日誌
 public void clear() {
  list.getList().clear();
 }
 //將需要記錄的日誌內容保存下來
 public void put(String text) {
  list.getList().add(text);
 }
 //返回需要記錄的日誌
 public String[] get() {
  return (String[]) list.getList().toArray(stringArray);
 }
}

 
在代碼中,您可以調用 DebugLogger.put() 來保存您的程序正在做什麼的信息,而且,稍後如果有必要(例如發生了一個錯誤),您能夠容易地檢索與某個特定線程相關的調試信息。 與簡單地把所有信息轉儲到一個日誌文件,然後努力找出哪個日誌記錄來自哪個線程(還要擔心線程爭用日誌紀錄對象)相比,這種技術簡便得多,也有效得多。 
發佈了674 篇原創文章 · 獲贊 7 · 訪問量 561萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章