응용 프로그램의 다른 부분의 실행 시간을 어떻게 분석하고 기록 하시겠습니까?

StackOverflow https://stackoverflow.com/questions/1026009

  •  06-07-2019
  •  | 
  •  

문제

우리는 비누 메시지를 받아들이고, 처리를 수행하고, 다른 웹 서비스를 호출하고, 응답을 마사지하고 원래 발신자에게 다시 보내는 웹 응용 프로그램을 구축했습니다.

이러한 다른 단계에 대해 한 줄로 다른 실행 시간을 기록하고 싶습니다. 우리는 JBossws 스택과 함께 log4J를 사용합니다. 다시 말해, 로그 출력이 다음과 같은 모습을 원합니다.

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

여기서 3336ms가 요청을 제공하는 데 소요되는 총 시간, 2449ms는 웹 서비스의 응답을 기다리는 시간이며 861ms는 내부적으로 데이터를 마사지하는 시간입니다.

이러한 다른 계산은 코드의 다른 장소에서 발생하며, 우리는 각각을 시간에 시간을 할애하고 단일 방법의 끝에서 로거를 호출 할 수는 없습니다. 우리 중 하나는 다른 실행 시간을 추적하기 위해 가난한 사람의 글로벌 변수 세트로 Log4J의 MDC를 사용하는 것을 제안했습니다.

그래서 내 질문은 다음과 같습니다.

  1. 이것이 MDC의 주요 의도에 대한 끔찍한 학대입니까?
  2. 그렇다면 어떻게해야합니까?
도움이 되었습니까?

해결책

살펴보세요 SLF4J 프로파일 러. 흥미롭게도. TT는 동일한 요구에 부응하기 위해 개발되었습니다. 즉, 비누 호출의 성능을 측정하고 향상시키기위한 것입니다.

다른 팁

직업처럼 들립니다 perf4j.

다음을 수행 할 것입니다.

  1. 퍼포먼스 캐시머 클래스를 생성하여 다음을 드러냅니다.
    • recordwaitedforwebserverReponse (OperationID, Time);
    • RecordMassagedData (OperationID, Time);
    • 필요한 경우 다른 방법
  2. 필요한 곳에 그 수업을 주입하십시오.
  3. Performancetimer가 Operationid-> OperationTimingData의 동시지도를 유지하도록하십시오.
  4. 마지막으로 알려진 메소드 호출에서 원하는 출력으로 log4J를 호출하십시오.

그것이 확실히 효과가 있지만, 나는 생각에도 울부 짖습니다. 내 제안은 사용하는 목적을 위해 타이밍 클래스를 만드는 것입니다. ThreadLocal 요청 당 변수를 생성합니다.

요청이 들어 오면 변수를 만듭니다 (a long 시작 시간으로). 변수가 이미 존재하면 내버려 두십시오. 결과가 클라이언트로 다시 전송되면 지속 시간을 계산하고 기록합니다.

나는 스프링과 측면 지향 프로그래밍을 사용하여이를 수행했습니다. 좋은 점은 논리를 한 번 작성하고 필요한 곳마다 선언적으로 적용한다는 것입니다.

한 가지 간단한 방법은 사용하는 것입니다 System.currentTimeMillis() Milli 초에 시간이 반환됩니다. 방법의 시작시 밀리 셰의 차이와 방법의 끝에서 Milli 초의 차이는 특정 방법을 실행하기 위해 Milli SEC가 취할 수 있습니다. 희망 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 ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top