代码之家  ›  专栏  ›  技术社区  ›  Santiago Palladino

在多线程应用程序中记录活动

  •  5
  • Santiago Palladino  · 技术社区  · 16 年前

    我在爪哇有一个分层的应用程序,它有一个多线程数据访问层,它从不同的点调用。对该层的单个调用可能会产生多个线程,以并行处理对数据库的请求。

    我要找的是一个日志记录工具,它允许我定义由不同线程组成的“活动”。因此,数据访问层中的相同方法应该根据调用方记录不同的输出。将不同的输出分组以汇总操作的总成本的能力也很重要。

    虽然应用程序是Java语言,但语言不是限制,我需要的是设计指南,以便最终实现它。我们目前正在使用log4j,但无法从中获得这种行为。

    7 回复  |  直到 16 年前
        1
  •  4
  •   fbrereto    16 年前

    你也应该看看 nested diagnostic context log4j的特性。为不同的调用者将不同的上下文推送到记录器中可能会为您带来一些好处。

        2
  •  4
  •   Sunny Milenov    16 年前

    您应该能够传递一个记录器,所以您可以为任务数据(即用户名等)创建一个基于一些“公共”的记录器,然后将这个记录器作为参数传递给您需要的所有方法。这样,您就可以在log4j配置文件中设置不同的过滤器和/或规则。或者根据记录器名称来擦除输出文件。

    编辑:还可以检查log4j中的mdc和ndc类。您可以在其中添加上下文数据。

        3
  •  2
  •   trunkc    16 年前

    在log4j中,可以用“%t”模式记录线程名。见 log4j Pattern Layout .

        4
  •  2
  •   mfx    16 年前

    在我的一个(web)应用程序中,我使用了一个线程本地记录器,它将日志信息捕获到一个StringBuilder中。logger对象在httpservlet service方法中初始化,如果设置了跟踪参数(如果未设置,则存在非常快的空记录器)。结果输出要么作为HTML注释转储到请求页面,要么写入一个段中的日志文件。

        5
  •  0
  •   Chris Mazzola    16 年前

    在Java5(及更高版本)中,您可以调用

    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    

    检查堆栈跟踪到您想要的深度,并相应地记录。

    在爪哇1.4,你可以得到相同的信息

    StackTraceElement[] stackTrace = new Exception().getStackTrace();
    
        6
  •  0
  •   scotty    16 年前

    您希望将记录器对象与我认为的线程相关联。保存每个线程的log4j记录器实例的threadLocal变量可能有助于:

    http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html

        7
  •  0
  •   Community CDub    8 年前

    您需要将一些结构传递给数据访问层,以标识当前的“活动”。您可能已经有了一个“活动”——一个有意义的类,您可以使用一个记录器实例作为 Sunny suggested 或者您可以使用第三种结构来跟踪活动上下文。

    在任何情况下,由于您的“活动”是跨多个线程处理的,所以您不能使用线程本地存储来跟踪当前的“活动”,就像大多数其他当前答案所建议的那样。你需要明确地传递它。

    我建议在log4j的顶部做一个小的外观,用类似的方法扩展接口

    void debug(Activity activity, String message);
    

    并从数据访问层将活动上下文传递给它。

    您将需要对数据访问层进行一些修改,以允许您将当前活动传递给它,但是如何最好地这样做很大程度上取决于当前接口。 如果使用工作区模式,可能只需要在工作区类上添加setActivity()方法,但其他接口模式可能需要向所有方法添加Activity参数。

    如果出于某种原因,您不能或不愿意更改数据访问层,那么您当然可以在调用数据访问层之前将活动上下文存储在线程本地存储中,并在生成子线程或将作业排入数据访问层之前检索它。这是一个可行的解决方案,但以这种方式传递信息有点危险吗?