在logback中记录并行线程

Pan*_*cea 9 testng multithreading webdriver logback

我将尝试简要描述我的Selenium框架,以便我可以解释我的问题.

我使用Selenium 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 - 创建用于访问DataBase的DataSource

18:48:58.551 [TestNG] DEBUG daastsetup.TestConfiguration - 创建用于访问DataBase的DataSource

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 - 查询成功

正如您所看到的,无法看到同时运行的两个线程之间的差异.我的问题是,有没有办法我可以配置回溯设置,以便他们还添加一个数字或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>
Run Code Online (Sandbox Code Playgroud)

Cek*_*eki 10

Logback Mapped Diagnostic Context(MDC)是您的朋友.它允许您添加可以在线程之间进行管理,复制并使用日志记录格式记录的线程局部变量.

来自文档:

logback的设计目标之一是审计和调试复杂的分布式应用程序.大多数现实世界的分布式系统需要同时处理多个客户端.在这种系统的典型多线程实现中,不同的线程将处理不同的客户端.将一个客户端的日志记录输出与另一个客户端的日志记录输出区分开来的可能但稍微不鼓励的方法包括为每个客户端实例化一个新的独立记录器.这种技术促进了记录器的扩散,并可能增加其管理开销.

较轻的技术包括对给定客户端的每个日志请求进行唯一标记.Neil Harrison在R. Martin,D.Riehle和F. Buschmann编辑的程序设计3的模式语言中记录诊断消息的模式中描述了这种方法(Addison-Wesley,1997).Logback利用SLF4J API中包含的此技术的变体:映射诊断上下文(MDC).

为了唯一地标记每个请求,用户将上下文信息放入MDC(映射诊断上下文的缩写).MDC类的显着部分如下所示.请参阅MDC javadocs以获取完整的方法列表.


pru*_*ule 7

仅供参考,您可以使用%thread创建线程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.
Run Code Online (Sandbox Code Playgroud)


Jer*_*orn 6

如果您想要像我通常那样使用%thread获得不可预知名称的替代方法,则可以使用简单的线程本地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();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后将这个简单的行放在你的logback XML中:

<conversionRule conversionWord="tid" 
    converterClass="com.yourstuff.logback.ThreadIdConverter" />
Run Code Online (Sandbox Code Playgroud)

设置你的模式是这样的(注意"tid"):

<pattern>%d{HH:mm:ss.SSS} [%tid] %-5level - %msg%n</pattern>
Run Code Online (Sandbox Code Playgroud)

您的日志将如下所示:

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
Run Code Online (Sandbox Code Playgroud)

您可以使用任何支持自定义扩展的记录器来执行此操作.希望能帮助到你.

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