2011-08-09 25 views
8

問題を説明できるように、私のSeleniumフレームワークの簡単な説明をしようとします。ログバックでの並列スレッドのログ

Iはセレン2(現在のバージョン2.3.1)+ TestNGの5.14

私はちょうど2つのインスタンス

、並列にテストスイートでテストを実行するtestng.xmlファイルのセットを使用しますログの目的のために、私はログバックを使用しています(私はログの世界で次善のものです)

私の問題は、アプリケーションのログを確認すると、私はこのような何かを得る:

18:48:58.551 [TestNGの] INFO daastsetup.TestConfiguration - はユーザープール

18からランダムにユーザーの検索: - からランダムユーザーの取得 58.551 [TestNGの] INFO daastsetup.TestConfiguration:48ユーザープール

18:48:58.551 [TestNGの] DEBUGのdaastsetup.TestConfiguration - データベース

18 acccessingのためのデータソースの作成:48: - 0 58.551 [TestNGの] DEBUGのdaastsetup.TestConfigurationを48:58.552 [TestNGの] DEBUGのdaastsetup.TestConfiguration - 起動SQLクエリ - :48: 起動SQLクエリ

18 58.552 [TestNGの] DEBUGのdaastsetup.TestConfigurationデータベース

18をacccessingための作成データソース

18:48:59.613 [TestNGの】TRACEのdaastsetup.TestConfiguration - クエリ 成功し

18:48:59.613 [TestNGの】TRACEのdaastsetup.TestConfiguration - クエリ 成功

ご覧のとおり、同時に実行されている2つのスレッドの違いを見ることはできません。私の質問は、実行中の各スレッドを識別するための番号や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の設計目標の

一つは、分散アプリケーションを監査し、デバッグ複雑なことです。現実の分散システムのほとんどは、複数のクライアントを同時に処理する必要があります。このようなシステムの典型的なマルチスレッド実装では、異なるスレッドが異なるクライアントを処理します。 1つのクライアントのログ出力を別のクライアントと区別するために、可能性はあるがやや落胆したアプローチは、各クライアントごとに別々のロガーをインスタンス化することから成ります。この手法は、ロガーの拡散を促進し、管理オーバーヘッドを増加させる可能性があります。

より軽い方法は、特定のクライアントにサービスする各ログ要求を一意にスタンプすることです。 Neil Harrisonは、この方法をR.Martin、D.Riehle、およびF.Buschmann(Addison-Wesley、1997)によって編集された、プログラム設計3のパターン言語における診断メッセージのロギングのためのパターンブックに記載した。 Logbackは、SLF4J APIに含まれるこの手法の変種を活用しています。マップされた診断コンテキスト(MDC)。

各要求を一意的にスタンプするために、ユーザーはコンテキスト情報をMDC(Mapped Diagnostic Contextの略語)に入れます。 MDCクラスの顕著な部分を以下に示します。メソッドの完全なリストについては、MDC javadocsを参照してください。 FYI

+0

ありがとう、Ceki! MDCは私にとって完璧に機能しました。誰かが興味があれば、Listenerクラス(** TestListenerAdapter **のサブクラス)を作成し、メソッドonStart(ITestContext testContext)に次の行を追加します:** MDC.put( "tests"、testContext.getName()) ; ** – Panacea

5

、あなたは出力スレッドIDをhttp://logback.qos.ch/manual/configuration.htmlのマニュアルに記載されている%の糸を使用することができます:あなたは通常、あなたは私のように%の糸で取得する予測不可能な名前の代替を希望の場合は

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のXMLにこのシンプルなラインを入れて... 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(); 
    } 
} 

に動作します:

<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

nextIdメソッドで同期するのではなく、[AtomicInteger](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html)を使用できます。 –

+0

優れた例です。助けてくれて、ありがとう! – JavaTec