2011-08-09 53 views
8

我將嘗試對我的Selenium框架進行簡要描述,以便我可以解釋我的問題。在logback中記錄並行線程

我使用硒2(當前版本2.3.1)+ TestNG的5.14

予設定的testng.xml文件以運行在測試套件在平行試驗中,僅有2個實例

爲了記錄的目的,我使用的logback (我讀過的日誌世界退而求其次)

我的問題是,當檢查哪些應用程序日誌中我得到的是這樣的:

18:48:58.551 [TestNG的] INFO daastsetup.TestConfiguration - 隨機檢索用戶從用戶普爾

18:48:58.551 [TestNG的] INFO daastsetup.TestConfiguration - 檢索從隨機用戶用戶普爾

18:48:58.551 [TestNG的] DEBUG daastsetup.TestConfiguration - 創建數據源爲acccessing數據庫

18:48:58.551 [TestNG的] DEBUG daastsetup.TestConfiguration - 創建數據源爲acccessing數據庫

18:48:58.552 [TestNG的] DEBUG daastsetup.TestConfiguration - 啓動SQL查詢

18:48:58.552 [TestNG的] DEBUG daastsetup.TestConfiguration - 啓動SQL查詢

18:48:59.613 [TestNG的] TRACE daastsetup.TestConfiguration - 查詢 成功的

18:48:59.613 [TestNG的] TRACE daastsetup.TestConfiguration - 查詢 成功

如您所見,不可能看到同時運行的兩個線程之間的差異。我的問題是,有沒有一種方法可以配置logback設置,以便他們也添加一個數字或Id來標識正在運行的每個線程?

PD萬一它可以幫助,我logback.xml文件看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 

    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>logs/selenium.log</file> 

    <encoder> 
     <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> 
    </encoder> 
    </appender> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are assigned the type 
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
    </appender> 

    <root level="trace"> 
    <appender-ref ref="FILE" /> 
    <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 

謝謝您的幫助=)

} {靈丹妙藥

回答

10

的logback Mapped Diagnostic Context (MDC)是你的朋友。它允許您添加可以管理的線程局部變量,在線程之間複製並使用記錄格式進行記錄。

從文檔:

之一的logback的設計目標是審覈和調試複雜的分佈式應用程序。大多數真實世界的分佈式系統需要同時處理多個客戶端。在這種系統的典型多線程實現中,不同的線程將處理不同的客戶端。區分一個客戶端與另一個客戶端的日誌記錄輸出的一種可能的但有點阻礙的方法包括爲每個客戶端實例化一個新的單獨的記錄器。這種技術促進了伐木工人的泛濫,並可能增加他們的管理開銷。

一個較輕的技術由唯一標記每個服務給定客戶端的日誌請求組成。 Neil Harrison在R. Martin,D. Riehle和F. Buschmann(Addison-Wesley,1997)編輯的「程序設計3模式語言記錄診斷消息模式」一書中描述了這種方法。 Logback利用SLF4J API中包含的這種技術的變體:映射診斷上下文(MDC)。

爲了唯一標記每個請求,用戶將上下文信息放入MDC(映射診斷上下文的縮寫)中。下面顯示了MDC類的顯着部分。請參閱MDC javadocs以獲取完整的方法列表。

+0

謝謝,Ceki! MDC對我來說工作得很好。如果任何人有興趣,我已經創建了一個Listener類(** TestListenerAdapter **的子類)和onStart(ITestContext testContext)方法我把這一行:** MDC.put(「tests」,testContext.getName()) ; ** – Panacea

5

僅供參考,您可以輸出使用作爲http://logback.qos.ch/manual/configuration.html文檔中描述%線程的線程ID:

The output is formatted using a PatternLayoutEncoder set to the pattern %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n. 
3

如果您想給您%線程得到,因爲我通常是不可預測的名稱替代你可以使用簡單的線程本地ID。它在眼睛上更容易。這將工作的logback ...

public class ThreadIdConverter extends ClassicConverter { 
    private static int nextId = 0; 
    private static final ThreadLocal<String> threadId = new ThreadLocal<String>() {  
    @Override 
    protected String initialValue() { 
     int nextId = nextId(); 
     return String.format("%05d", nextId); 
    } 
    }; 

    private static synchronized int nextId() { 
    return ++nextId; 
    } 

    @Override 
    public String convert(ILoggingEvent event) { 
    return threadId.get(); 
    } 
} 

然後把這個簡單的線在你的logback XML:

<conversionRule conversionWord="tid" 
    converterClass="com.yourstuff.logback.ThreadIdConverter" /> 

設置你的模式是這樣的(通知 「TID」):

<pattern>%d{HH:mm:ss.SSS} [%tid] %-5level - %msg%n</pattern> 

而您的日誌將如下所示:

10:32:02.517 [00001] INFO something here 
10:32:02.517 [00002] INFO something here 
10:32:02.517 [00003] INFO something here 
10:32:02.517 [00001] INFO something more here 
10:32:02.517 [00001] INFO something more here 

您可以使用任何支持自定義擴展的記錄器來執行此操作。希望能幫助到你。

+2

您可以使用[AtomicInteger](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html),而不用在您的nextId方法上同步。 –

+0

優秀的例子。幫助我,謝謝! – JavaTec