簡體   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