在 logback 中记录并行线程

2024-04-10

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

I use 硒2(当前版本2.3.1)+测试NG 5.14

我设置 testng.xml 文件来并行运行测试套件中的测试,只有 2 个实例

出于记录目的,我使用logback(我读过这是日志世界中下一个最好的事情)

我的问题是,当检查应用程序日志内容时,我得到如下信息:

18:48:58.551 [TestNG] 信息 d.a.a.s.t.setup.TestConfiguration - 从用户池中检索随机用户

18:48:58.551 [TestNG] 信息 d.a.a.s.t.setup.TestConfiguration - 从用户池中检索随机用户

18:48:58.551 [TestNG] 调试 d.a.a.s.t.setup.TestConfiguration - 创建数据源以访问数据库

18:48:58.551 [TestNG] 调试 d.a.a.s.t.setup.TestConfiguration - 创建数据源以访问数据库

18:48:58.552 [TestNG] 调试 d.a.a.s.t.setup.TestConfiguration - 启动 SQL 查询

18:48:58.552 [TestNG] 调试 d.a.a.s.t.setup.TestConfiguration - 启动 SQL 查询

18:48:59.613 [TestNG] TRACE d.a.a.s.t.setup.TestConfiguration - 查询 成功的

18:48:59.613 [TestNG] TRACE d.a.a.s.t.setup.TestConfiguration - 查询 成功的

正如您所看到的,不可能看出同时运行的两个线程之间的差异。我的问题是,有没有办法可以配置 logback 设置,以便它们还添加一个数字或 Id 来标识每个正在运行的线程?

PD 以防万一它可能有帮助,我的日志记录文件文件看起来像这样:

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

Logback 映射诊断上下文 http://logback.qos.ch/manual/mdc.html(MDC)是你的朋友。它允许您添加可以管理、在线程之间复制并使用日志记录格式记录的线程局部变量。

来自文档:

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

一种较轻的技术包括为给定客户端提供服务的每个日志请求进行唯一标记。 Neil Harrison 在 R. Martin、D. Riehle 和 F. Buschmann 编辑的《Patterns for Logging Diagnostic Messages in Pattern Languages of Program Design 3》一书中描述了这种方法(Addison-Wesley,1997 年)。 Logback 利用 SLF4J API 中包含的该技术的变体:映射诊断上下文 (MDC)。

为了唯一地标记每个请求,用户将上下文信息放入 MDC(映射诊断上下文的缩写)中。 MDC 类的重要部分如下所示。请参阅MDC java文档 http://www.slf4j.org/api/org/slf4j/MDC.html获取方法的完整列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 logback 中记录并行线程 的相关文章

  • 如何使用.net更改selenium中的用户代理

    我想使用不同的代理 iPhone iPad Android 测试用 NET 编写的 Web 应用程序 我使用 NUnit 和 Selenium 进行测试 有人有一个用 c 或 VB 在 Selenium 中更改代理 例如 iPad 或 iP
  • 为什么 std::atomic 比 volatile bool 慢很多?

    多年来我一直使用 volatile bool 来控制线程执行 并且效果很好 in my class declaration volatile bool stop In the thread function while stop do th
  • 多个线程将其结果填充到一个 DataTable C# 中

    我刚刚开始学习线程的概念 我有点陷入这个问题 它让我发疯 我实际上需要完成什么 我在本地目录中有大约 300 个文本文件 需要解析它们以获取特定值 在每个文本文件中找到这些 值 后 我需要将它们存储在数据库中 因此 我遵循访问目录中每个文本
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • Java Executor 根据 CPU 和 RAM 使用情况调整线程池

    我的应用程序使用 Executor 为大量任务提供线程池 通过分析和基准测试 我确定当每个核心有多个线程时 我的应用程序运行速度最快 一个好的启发式方法是从每个核心 4 个线程开始 不断变化 直到达到 gt 90 CPU 或 gt 90 R
  • Unity3d 中的多线程脚本调用

    我试图在Unity3d中实现多线程脚本执行 但是Unity库似乎没有提供方法 我们必须使用Mono提供的System Threading 但他们提到 Unity Scripting 不是线程安全的 我可以使用 System threadin
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util
  • 不支持 STA 线程上多个句柄的 WaitAll

    为什么我会收到此错误消息 不支持 STA 线程上多个句柄的 WaitAll 我应该使用 STAThreadAttribute 属性吗 Update 不适用于 WPF 应用程序 笔记 错误位于 WaitHandle WaitAll doneE
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • 如果未返回,则在一段时间后终止线程

    我有一个线程从网络或串行端口获取一些数据 如果 5 秒内没有收到数据 则线程必须终止 或返回 false 换句话说 如果线程运行时间超过 5 秒 则必须停止 我用 C 编写 但任何 NET 语言都可以 有两种方法 1 封装超时 从网络或串行
  • 线程自身连接

    我很怀疑 当线程加入自身时会发生什么 即线程自行调用 join 方法 我没有收到任何错误 样本 public class JoinItself extends Thread public void run System out printl
  • 在不支持 CAS 操作的处理器上进行 CompareAndSet

    今天 我在一次采访中被问到下一个问题 如果您在具有不支持 CAS 操作的处理器的机器上调用 AtomicLong 的compareAndSet 方法 会发生什么情况 您能否帮我解决这个问题 并在可能的情况下提供一些全面描述的链接 From
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • Python 中 time.sleep 和多线程的问题

    我对 python 中的 time sleep 函数有疑问 我正在运行一个脚本 需要等待另一个程序生成 txt 文件 虽然 这是一台非常旧的机器 所以当我休眠 python 脚本时 我遇到了其他程序不生成文件的问题 除了使用 time sl
  • 为什么在读取字典时要锁定

    我对我正在阅读的一本关于线程的书 C 3 in a Nutshell 中的代码列表感到困惑 在 应用程序服务器中的线程安全 主题中 给出了以下代码作为 UserCache 的示例 static class UserCache static
  • 如何通过start-stop-daemon正常关闭Spring Boot应用程序[重复]

    这个问题在这里已经有答案了 我们有一个多线程 Spring Boot 应用程序 它作为守护进程在 Linux 机器上运行 当我尝试像这样通过启动停止守护进程停止应用程序时 start stop daemon stop quiet retry
  • 如何限制Erlang VM(BEAM)使用的核心数量?

    我正在具有 2 个四核 Xeon E5520 2 2GHz 24 0GB RAM 和 Erlang R15B02 启用 SMP 的节点上运行实验 我想知道是否可以限制Erlang VM使用的核心数量 以便我可以暂时禁用一些核心并逐步增加数量
  • 如何使用 runOnUiThread 而不出现“无法对非静态方法进行静态引用”编译器错误

    我有一个主课 ClientPlayer extends Activity 和一项服务 LotteryServer extends Service implements Runnable 当尝试在此服务的 run 方法中使用 RunOnUiT
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • 终结器线程的范围是什么 - 每个应用程序域或每个进程?

    根据我的所有阅读 应该有一个 GC 线程来调用所有终结器 现在的问题是这个 一个 线程的范围是什么 每个进程或每个应用程序域 因为域的整体目的是在一个进程空间中分离并创建 独立 的不同应用程序 I read here http dn cod

随机推荐