你将如何打破和记录在执行时间的不同部分应用程序?
题
我们已经建立了一个网络应用程序,接受肥皂消息,也有一些处理、调到另一个网络服务,按摩服务的响应和sendd它回到原来的呼叫者。
我们想要登录,在一个单一的线,不同执行时间对这些不同的步骤。我们使用log4j与JBossWS堆。换句话说,我们想要登录产出,看起来是这样的:
2009-06-10T16:19:31.487 3336/2449/861
在3336ms是总花费的时间提供服务的请求,2449ms所花费的时间等待网服务的响应,并861ms所花费的时间内按摩的数据。
这些不同的计算发生在不同的地方,在我们的代码,我们不能只是时间的每一个和他们打个电话的记录在一个单一的方法。我们中的一个建议使用log4j的MDC此作为一个穷人的一套全球变量跟踪的不同执行时间。
所以我的问题如下:
- 这是一个可怕的滥用MDC的主要意图是什么?
- 如果是的话,你会怎么做这个?
解决方案
请查看 SLF4J分析器。有趣的是。开发tt是为了满足完全相同的需求,即测量和改进SOAP调用的性能。
其他提示
听起来像 Perf4J 的工作。
我会做到以下几点:
- 创建一个PerformanceTimer类,它暴露:
- recordWaitedForWebServerReponse(operationId,时间);
- recordMassagedData(operationId,时间);
- 其他方法,如果需要的话
- 注入这一类,它就是需要的;
- 有PerformanceTimer保持一个并发的地图OperationId->OperationTimingData;
- 在方法调用已知最后,调用Log4j与输出你所希望的。
虽然它肯定会奏效,但我也对这个想法感到畏缩。我的建议是为此目的创建一个计时类,它使用 ThreadLocal
为每个请求创建一个变量。
当请求进入时,您创建变量(带有开始时间的 long
)。当变量已经存在时,您可以不管它。当结果发送回客户端时,您将计算持续时间并记录该值。
我会使用Spring和面向方面的编程来完成它。好消息是我会编写一次逻辑并在需要的地方以声明方式应用它。
一种简单的方法是使用 System.currentTimeMillis()
,它以毫秒为单位返回时间。
方法开始时的毫秒与方法结束时的毫秒之间的差异将给出执行该特定方法所需的毫秒数。
希望 System.currentTimeMillis()
会对您有所帮助。
我们只是在第一个请求过滤器中使用它:
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");
不隶属于 StackOverflow