您如何分解并记录应用程序不同部分的执行时间?

时间:2009-06-22 08:05:37

标签: java profiling log4j

我们构建了一个Web应用程序,它接受SOAP消息,进行一些处理,调用另一个Web服务,按摩响应并将其发送回原始调用者。

我们想在一行中记录这些不同步骤的不同执行时间。我们将log4j与JBossWS堆栈一起使用。换句话说,我们希望日志输出看起来像:

2009-06-10T16:19:31.487 3336/2449/861

其中3336ms是服务请求所花费的总时间,2449ms是等待Web服务响应所花费的时间,861ms是内部按摩数据所花费的时间。

这些不同的计算发生在我们的代码中的不同位置,我们不能只计算它们中的每一个,并在单个方法的末尾调用记录器。我们其中一个人建议使用log4j的MDC作为穷人的全局变量集来跟踪不同的执行时间。

所以我的问题如下:

  1. 这是对MDC主要意图的可怕滥用吗?
  2. 如果是的话,你会怎么做呢?

7 个答案:

答案 0 :(得分:4)

请查看SLF4J profiler。有趣的是。开发tt是为了满足完全相同的需求,即测量和改进SOAP调用的性能。

答案 1 :(得分:2)

听起来像是Perf4J的工作。

答案 2 :(得分:1)

我会做以下事情:

  1. 创建一个PerformanceTimer类,它暴露:
    • recordWaitedForWebServerReponse(operationId,time);
    • recordMassagedData(operationId,time);
    • 其他方法,如果需要
  2. 将该类注入所需的位置;
  3. 让PerformanceTimer维护一个OperationId的并发映射 - > OperationTimingData;
  4. 在已知最后的方法调用上,使用您想要的输出调用Log4j。

答案 3 :(得分:0)

虽然它肯定会奏效,但我也对这个想法感到畏缩。我的建议是为此创建一个计时类,使用ThreadLocal为每个请求创建一个变量。

当请求进入时,您创建变量(带有开始时间的long)。当变量已经存在时,您可以不管它。当结果发送回客户端时,您将计算持续时间并记录该值。

答案 4 :(得分:0)

我会使用Spring和面向方面的编程来完成它。好消息是我会编写一次逻辑并在需要的地方以声明方式应用它。

答案 5 :(得分:0)

一种简单的方法是使用System.currentTimeMillis()以毫秒为单位返回时间。 方法开始时的毫秒与方法结束时的毫秒之间的差异将给出执行该特定方法所需的毫秒数。 希望 System.currentTimeMillis() 会对您有所帮助。

答案 6 :(得分:0)

我们只是在第一个请求过滤器中使用它:

logger.trace("Init");
long start = System.currentTimeMillis();

//do stuff here 

long stop = System.currentTimeMillis();
String time = Util.getTimeDifferenceInSec(start, stop);
logger.trace("Complete in " + time + " sec");