2011-08-18 195 views
1

當我運行多個線程時,我在System.out.println輸出中迷路了,因爲我認爲每個線程必須位於不同的控制檯中。在控制檯管理多個線程

有沒有簡單的方法來使用Eclipse進行管理?

編輯:問題是不知道哪個消息屬於每個線程。確切的問題是,當一個新的線程被調用時控制檯停止打印,並且log4j也發生了同樣的情況。

回答

0

我剛剛配置爲將所有日誌寫入文件。

<appender name="rolling-file" class="org.apache.log4j.RollingFileAppender"> 
     <param name="file" value="home/.../mylog.log" /> 
     <param name="MaxFileSize" value="1000KB" /> 
<!--  Keep one backup file --> 
     <param name="MaxBackupIndex" value="4" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n" /> 
     </layout> 
</appender> 
3

我建議你切換到比System.out.println更好的測井設施,log4j是一個受歡迎的選擇。

如果你不想包括用於此目的的另一個庫,我建議你

  • 給所有線程有意義的名稱(見Thread.setName
  • 包裹日誌語句在你自己的靜態記錄功能
  • Thread.currentThread().getName()爲前綴的每行輸出。

如果你認爲是太「侵入」或如果你處理的遺留代碼,你可以創建自己的PrintStream其前綴各參數println與當前線程的名稱(如上),然後執行System.setOut(new YourThreadLoggingPrintStream());

+0

好的。我現在使用log4j。但是,它是一個Tomcat服務器。我應該在哪裏調用'BasicConfigurator.configure();'或者,在這種情況下並不那麼簡單? – coffee

+0

@Ernest我的意思是,我已經配置好了。但我不知道我怎麼能遵循我的3線程呢。不管怎麼說,還是要謝謝你。 – coffee

1

你可以使用log4j的,並設置了不同的記錄器爲每個線程,每個記錄器連接到不同的Eclipse視圖,但是這將是一個很大的配置和很多在您的應用程序編碼。或者,如果您只是將線程ID與消息一起記錄下來,那麼即使所有線程都記錄到相同視圖,您也可以知道打印出哪個線程。

1

如果您使用log4j,則可以使用嵌套診斷上下文來保持線程的正確記錄。

這裏是國家數據中心的描述從the log4j manual

大多數實際系統必須處理多個客戶端同時 。在這樣一個典型的多線程實現系統中,不同的線程將處理不同的客戶端。日誌記錄爲 ,特別適用於跟蹤和調試複雜的分佈式應用程序。區分 一個客戶端與另一個客戶端的日誌記錄輸出的常用方法是爲每個客戶端實例化一個新的單獨記錄器,用於 。這促進了記錄器的擴散,並增加了記錄的管理開銷。

甲打火機技術是獨特地標記來自同一客戶端相互作用引發 每個日誌的請求。尼爾·哈里森模式 語言程序設計3,由R.馬丁D.裏勒和F 佈施曼(Addison-Wesley出版社,1997年)編輯在書中描述的這種方法 「用於記錄診斷郵件的模式,」。

爲了唯一地標記每個請求,用戶將上下文信息 推入NDC,即嵌套診斷上下文的縮寫。 NDC 類如下所示。

public class NDC { 
    // Used when printing the diagnostic 
    public static String get(); 

    // Remove the top of the context from the NDC. 
    public static String pop(); 

    // Add diagnostic context for the current thread. 
    public static void push(String message); 

    // Remove the diagnostic context for this thread. 
    public static void remove(); } 

NDC作爲一組上下文信息被管理爲每個線程。 請注意,org.apache.log4j.NDC類的所有方法都是靜態的。 假設NDC打印已打開,每次發出日誌請求 時,相應的log4j組件都會在日誌輸出中包含當前線程的整個NDC 堆棧。這是在用戶干預的情況下完成的,該用戶只負責將 正確信息放在NDC中,方法是在代碼中幾個明確定義的點處使用推送和彈出方法。相比之下,每個客戶端的記錄器方法都會對代碼進行大量更改。

爲了說明這一點,我們舉一個servlet 爲衆多客戶端提供內容的例子。在執行其他代碼之前,servlet可以在請求開始時構建NDC 。上下文信息可以是客戶端的主機名和該請求固有的其他信息,通常包含Cookie中的 信息。因此,即使servlet同時爲多個客戶端 提供服務,由相同的代碼(即屬於同一個記錄器的 )啓動的日誌仍然可以被區分,因爲每個客戶端請求將具有不同的NDC堆棧。將這一點與將新實例化的記錄器傳遞給在客戶請求期間行使的所有代碼 的複雜性相對比。