我们构建了一个Web应用程序,它接受SOAP消息,进行一些处理,调用另一个Web服务,按摩响应并将其发送回原始调用者。
我们想在一行中记录这些不同步骤的不同执行时间。我们将log4j与JBossWS堆栈一起使用。换句话说,我们希望日志输出看起来像:
2009-06-10T16:19:31.487 3336/2449/861
其中3336ms是服务请求所花费的总时间,2449ms是等待Web服务响应所花费的时间,861ms是内部按摩数据所花费的时间。
这些不同的计算发生在我们的代码中的不同位置,我们不能只计算它们中的每一个,并在单个方法的末尾调用记录器。我们其中一个人建议使用log4j的MDC作为穷人的全局变量集来跟踪不同的执行时间。
所以我的问题如下:
答案 0 :(得分:4)
请查看SLF4J profiler。有趣的是。开发tt是为了满足完全相同的需求,即测量和改进SOAP调用的性能。
答案 1 :(得分:2)
听起来像是Perf4J的工作。
答案 2 :(得分:1)
我会做以下事情:
答案 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");