繁体   English   中英

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

[英]How would you break down and log the execution times of different parts of your application?

我们已经构建了一个Web应用程序,该应用程序接受SOAP消息,进行一些处理,调出另一个Web服务,整理响应并将其发送回原始调用方。

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

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

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

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

所以我的问题如下:

  1. 这是对MDC主要意图的可怕滥用吗?
  2. 如果是,否则您将如何做?

请看看SLF4J分析器 有趣的是。 开发tt是为了满足完全相同的需求,即测量和提高SOAP调用的性能。

听起来像Perf4J的工作。

我将执行以下操作:

  1. 创建一个PerformanceTimer类,该类公开:
    • recordWaitedForWebServerReponse(operationId,time);
    • recordMassagedData(operationId,time);
    • 其他方法(如果需要)
  2. 在需要的地方注入该类;
  3. 让PerformanceTimer维护OperationId-> OperationTimingData的并发映射;
  4. 在已知为最后一个方法调用上,使用所需的输出调用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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM