2011-08-09 19 views
8

voy a tratar de hacer una breve descripción de mi marco de selenio para que pueda explicar mi problema.Registro de hilos paralelos en logback

utilizo Selenio 2 (versión actual 2.3.1) + TestNG 5.14

puse testng.xml archivo para ejecutar las pruebas en el banco de pruebas en paralelo, a sólo 2 casos

para propósitos de registro, uso logback (que he leído es la siguiente mejor cosa en el mundo de registro)

Mi problema es que al comprobar lo que los registros de la aplicación me sale algo como esto:

18: 48: 58,551 [TestNG] INFO daastsetup.TestConfiguration - Recuperando usuario azar de piscina usuario

18: 48: 58,551 [TestNG] INFO daastsetup.TestConfiguration - Recuperando usuario azar de piscina de usuario

18: 48: 58,551 [TestNG] DEBUG daastsetup.TestConfiguration - Crear origen de datos para la Base de Datos acccessing

18: 48: 58,551 [TestNG] DEBUG daastsetup.TestConfiguration - Crear origen de datos para la Base de Datos acccessing

18: 48: 58,552 [TestNG] DEBUG daastsetup.TestConfiguration - Lanzamiento de consultas SQL

18: 48: 58,552 [TestNG] DEBUG daastsetup.TestConfiguration - Lanzamiento de consultas SQL

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

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

Como puede ver, es imposible ver la diferencia entre los dos hilos que se están ejecutando al mismo tiempo. Mi pregunta es, ¿hay alguna manera de configurar la configuración de inicio de sesión para que también agreguen un número o identificador para identificar cada hilo que se está ejecutando?

PD Sólo en caso de que puede ayudar, mi logback.xml archivo es como sigue:

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

Gracias por su ayuda =)

} {Panacea

Respuesta

10

Logback Mapped Diagnostic Context (MDC) es tu amigo. Le permite agregar variables locales de subprocesos que pueden administrarse, copiarse entre subprocesos y registrarse con un formato de registro.

A partir de los documentos:

Uno de los objetivos de diseño de logback es auditar y complejo de depuración de aplicaciones distribuidas.La mayoría de los sistemas distribuidos del mundo real necesitan tratar con múltiples clientes simultáneamente. En una implementación típica multiproceso de dicho sistema, diferentes hilos manejarán diferentes clientes. Un posible enfoque, aunque ligeramente desaconsejado, para diferenciar la salida de registro de un cliente de otro consiste en crear instancias de un registrador nuevo y separado para cada cliente. Esta técnica promueve la proliferación de madereros y puede aumentar sus gastos de administración.

Una técnica más ligera consiste en sellar de forma única cada solicitud de registro que atiende a un cliente determinado. Neil Harrison describió este método en el libro Patterns for Logging Diagnostic Messages in Pattern Languages ​​of Program Design 3, editado por R. Martin, D. Riehle y F. Buschmann (Addison-Wesley, 1997). Logback aprovecha una variante de esta técnica incluida en la API de SLF4J: Contextos de diagnóstico mapeados (MDC).

Para sellar de forma única cada solicitud, el usuario coloca información contextual en el MDC, la abreviatura de Contexto de diagnóstico asignado. Las partes principales de la clase MDC se muestran a continuación. Consulte el MDC javadocs para obtener una lista completa de métodos.

+0

Gracias, Ceki! MDC funcionó perfectamente bien para mí. Si alguien está interesado, he creado una clase Listener (subclase de ** TestListenerAdapter **) y en el método onStart (ITestContext testContext) Pongo esta línea: ** MDC.put ("tests", testContext.getName()) ; ** – Panacea

5

FYI, puede generar el ID del tema con hilo% como se describe en la documentación en 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 desea una alternativa a los nombres impredecibles que se obtiene con rosca%, ya que normalmente hacer, puede usar identificadores locales de subprocesos simples. Es mucho más fácil para los ojos. Esto funciona con 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(); 
    } 
} 

luego poner esta línea simple en su logback XML:

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

Establecer el patrón de algo como esto (aviso "tid"):

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

Y sus registros se verá así:

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 

Puede hacer esto con cualquier registrador que admita extensiones personalizadas. Espero eso ayude.

+2

Puede usar [AtomicInteger] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html) en lugar de molestar con la sincronización en su método nextId . –

+0

excelente ejemplo. Me ayudó, gracias! – JavaTec

Cuestiones relacionadas