1. 程式人生 > >利用ThreadLocal記錄日誌

利用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() 來儲存您的程式正在做什麼的資訊,而且,稍後如果有必要(例如發生了一個錯誤),您能夠容易地檢索與某個特定執行緒相關的除錯資訊。 與簡單地把所有資訊轉儲到一個日誌檔案,然後努力找出哪個日誌記錄來自哪個執行緒(還要擔心執行緒爭用日誌紀錄物件)相比,這種技術簡便得多,也有效得多。