2011-08-09 7 views
8

Je vais essayer de faire une brève description de mon framework Selenium afin que je puisse expliquer mon problème.Enregistrement des threads parallèles dans le logback

J'utilise Sélénium 2 (version 2.3.1) + testng 5.14

Je mis testng.xml fichier pour exécuter les tests de la suite en parallèle de test, à seulement 2 cas

aux fins de l'exploitation forestière, j'utilise logback (je l'ai lu est la meilleure chose dans le monde du journal)

Mon problème est que lors de la vérification de ce que les journaux d'application je reçois quelque chose comme ceci:

18: 48: 58,551 [TestNG] INFO daastsetup.TestConfiguration - Récupération utilisateur aléatoire de pool d'utilisateurs

18: 48: 58,551 [TestNG] INFO daastsetup.TestConfiguration - Récupération utilisateur aléatoire de L'utilisateur Piscine

18: 48: 58,551 [TestNG] DEBUG daastsetup.TestConfiguration - Création DataSource pour acccessing DataBase

18: 48: 58,551 [TestNG] DEBUG daastsetup.TestConfiguration - Création DataSource pour acccessing DataBase

18: 48: 58,552 [TestNG] DEBUG daastsetup.TestConfiguration - Lancement de requêtes SQL

18: 48: 58,552 [TestNG] DEBUG daastsetup.TestConfiguration - Lancement requête SQL

18: 48: 59,613 [TestNG] TRACE daastsetup.TestConfiguration - Query

réussie

18: 48: 59,613 [TestNG] TRACE daastsetup.TestConfiguration - Query

Comme vous pouvez le voir, il est impossible de voir la différence entre les deux threads qui tournent en même temps. Ma question est, y a-t-il un moyen de configurer les paramètres de logback afin qu'ils ajoutent également un numéro ou un identifiant pour identifier chaque thread qui est en cours d'exécution?

PD Juste au cas où il peut aider, mon logback.xml fichier ressemble à ceci:

<?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> 

Merci pour votre aide =)

} {Panacée

Répondre

10

Logback Mapped Diagnostic Context (MDC) est votre ami. Il vous permet d'ajouter des variables locales de thread qui peuvent être gérées, copiées entre threads, et enregistrées en utilisant un format de journalisation.

De la documentation:

L'un des objectifs de conception de logback consiste à auditer et complexe de débogage des applications distribuées.La plupart des systèmes distribués dans le monde réel doivent traiter simultanément plusieurs clients. Dans une implémentation multithread typique d'un tel système, différents threads géreront différents clients. Une approche possible mais légèrement découragée pour différencier la sortie de journalisation d'un client d'un autre consiste à instancier un nouvel enregistreur distinct pour chaque client. Cette technique favorise la prolifération des enregistreurs et peut augmenter leurs frais généraux de gestion.

Une technique plus légère consiste à estamper de façon unique chaque demande de journal desservant un client donné. Neil Harrison a décrit cette méthode dans le livre Patterns for Logging Diagnostic Messages in Pattern Languages ​​de Program Design 3, édité par R. Martin, D. Riehle et F. Buschmann (Addison-Wesley, 1997). Logback exploite une variante de cette technique incluse dans l'API SLF4J: Mapped Diagnostic Contexts (MDC).

Pour tamponner chaque requête de manière unique, l'utilisateur place des informations contextuelles dans le MDC, l'abréviation de Mapped Diagnostic Context. Les parties saillantes de la classe MDC sont indiquées ci-dessous. Veuillez vous référer au MDC javadocs pour une liste complète des méthodes.

+0

Merci, Ceki! MDC a parfaitement fonctionné pour moi. Si quelqu'un est intéressé, j'ai créé une classe Listener (sous-classe de ** TestListenerAdapter **) et sur la méthode onStart (ITestContext testContext) j'ai mis cette ligne: ** MDC.put ("tests", testContext.getName()) ; ** – Panacea

5

Pour votre information, vous pouvez produire l'identifiant de fil en utilisant% fil tel que décrit dans la documentation à 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

Si vous souhaitez une alternative aux noms imprévisibles que vous obtenez avec fil% comme je l'ai souvent faites, vous pouvez utiliser des ID locaux simples. C'est beaucoup plus facile pour les yeux. Cela fonctionne avec 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(); 
    } 
} 

ensuite mis cette ligne simple dans votre XML logback:

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

Définissez votre modèle quelque chose comme ceci (avis "tid"):

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

Et vos journaux ressemblera à ceci:

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 

Vous pouvez le faire avec n'importe quel enregistreur prenant en charge les extensions personnalisées. J'espère que cela aide.

+2

Vous pouvez utiliser [AtomicInteger] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html) au lieu de vous soucier de la synchronisation de votre méthode nextId . –

+0

excellent exemple. M'a aidé, merci! – JavaTec

Questions connexes