【问题标题】:Java logging across multiple threads跨多个线程的 Java 日志记录
【发布时间】:2010-06-04 18:30:42
【问题描述】:

我们有一个使用线程的系统,因此它可以同时并行处理不同的功能位。我们希望找到一种将特定“事务”的所有日志条目绑定在一起的方法。通常,可以使用 'threadName' 将这些集合在一起,但显然这在多线程情况下会失败。

没有在每个方法调用中传递一个“事务密钥”,我看不到将它们联系在一起的方法。并且将密钥传递给每个方法都是丑陋的。

此外,我们有点依赖于 Java 日志记录,因为我们的系统是建立在它的修改版本之上的。因此,我会对其他平台感兴趣,以了解我们可能会尝试的示例,但切换平台的可能性极小。

有人有什么建议吗?
谢谢,
彼得

编辑:不幸的是,我无法控制线程的创建,因为这一切都由工作流包处理。否则,为每个线程缓存一次 ID 的想法(可能在 ThreadLocal 上?)然后在创建新线程时将其设置在新线程上是一个好主意。反正我也可以试试。

【问题讨论】:

  • 您能否在调用并发工作位(try/finally 模式)之前和之后设置/重置线程 ID,然后使用它来驱动日志记录?

标签: java multithreading logging


【解决方案1】:

您可以考虑创建一个全局可访问的Map,将Thread 的名称映射到其当前事务ID。在开始一个新任务时,为该事务生成一个 GUID,并让线程在Map 中注册自己。对它生成的任何 Threads 执行相同的任务以执行相同的任务。然后,当您需要记录某些内容时,您可以简单地根据当前Thread 的名称从全局Map 中查找事务ID。 (有点笨拙,但应该可以)

【讨论】:

  • 我喜欢这个想法,除了我看不到线程的实际生成。多亏了工作流包,它不在我的掌控之中。
  • 为了扩展这个想法,这里提出的是在一个线程一个线程的基础上对记录的事件进行排队。如果在处理过程中的某个时间点,您知道事务ID,那么您可以将它与排队的所有日志事件相关联。如果您正在生成大量日志事件,则此“队列”可能仍在文件系统上,并且您使用后处理步骤来转换 threadId --> transactionId。
【解决方案2】:

这是 AspectJ 横切的完美示例。如果您知道正在调用的方法,您可以在它们上放置拦截器并动态绑定。

本文会给你几个选择http://www.ibm.com/developerworks/java/library/j-logging/

【讨论】:

    【解决方案3】:

    但是您提到您的事务跨越多个线程,看看log4j 如何使用MDCNDC 类将附加信息绑定到当前线程。它使用ThreadLocal,正如您之前建议的那样,但有趣的是 log4j 如何将数据注入日志消息中。

    //In the code:

    MDC.put("RemoteAddress", req.getRemoteAddr());

    //在配置文件中,添加如下内容:

    %X{远程地址}

    详情:

    http://onjava.com/pub/a/onjava/2002/08/07/log4j.html?page=3

    http://wiki.apache.org/logging-log4j/NDCvsMDC

    【讨论】:

      【解决方案4】:

      如何命名您的线程以包含事务 ID?诚然,快速和肮脏,但它应该可以工作(直到您需要其他东西的线程名称或者您开始​​在线程池中重用线程)。

      【讨论】:

      • 我不知道你能做到这一点,所以谢谢,但我使用的是工作流包,所以我无法控制线程名称本身。
      【解决方案5】:

      如果你正在记录,那么你必须有某种记录器对象。您应该在每个线程中有一个单独的实例。

      • 为其添加一个名为 setID(String id) 的方法。
      • 当它在您的线程中初始化时,使用该方法设置一个唯一的 ID。
      • 为每个日志条目添加集合 ID。

      【讨论】:

        【解决方案6】:

        有几个人建议的答案是让新生成的线程以某种方式知道事务 ID 是什么。除非我遗漏了什么,否则为了将此 ID 放入新生成的线程中,我必须将其一直传递到生成线程的方法中,我不想这样做。

        我认为您不需要将其传递下去,而是负责将工作交给这些线程的代码需要传递 transactionID。工作分配者不是已经有了这个吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-11
          • 1970-01-01
          • 2012-04-27
          • 1970-01-01
          • 2016-10-05
          • 2012-10-14
          • 1970-01-01
          相关资源
          最近更新 更多