2010-06-04 5 views
2

우리는 병렬로 다른 기능 비트를 동시에 처리 할 수 ​​있도록 스레드를 사용하는 시스템을 가지고 있습니다. 특정 "트랜잭션"에 대한 모든 로그 항목을 함께 묶는 방법을 찾고 싶습니다. 일반적으로, 이들을 함께 모으기 위해 'threadName'을 사용할 수는 있지만 다중 스레드 상황에서는 실패합니다.다중 스레드를 통한 Java 로깅

모든 메소드 호출을 통해 '트랜잭션 키'를 전달하는 것보다 짧아서,이 두 가지를 하나로 묶을 방법이 없습니다. 모든 단일 메서드에 키를 전달하는 것은 단지 추한 것입니다.

또한 Google 시스템은 수정 된 버전으로 빌드되므로 자바 로깅과 관련이 있습니다. 따라서 우리가 시도 할 수있는 다른 플랫폼에 대한 예제가 필요 하겠지만 플랫폼을 전환하는 것은 거의 불가능합니다.

누구에게 의견이 있습니까?
감사합니다,
피터

편집 : 그 모든 워크 플로우 패키지에 의해 처리있어 불행하게도, 나는 스레드의 생성을 제어 할 수 없습니다. 그렇지 않으면 ThreadLocal의 각 스레드마다 ID를 한 번 캐싱 한 다음 새 스레드가 생성 될 때이를 설정하는 것이 좋습니다. 나는 어쨌든 그것을 시도 할 수 있습니다.

+0

당신이/방금 전에 스레드 ID를 재설정하고 작업의 동시 비트를 호출 한 후에 설정할 수 있습니다 (/ 마침내 패턴 시도), 및 그런 다음 로깅을 사용 하시겠습니까? –

답변

0

트랜잭션 ID를 포함하도록 스레드의 이름을 지정하는 것이 어떻습니까? Quick and Dirty, admittedly,하지만 다른 스레드 이름이 필요하거나 스레드 풀에서 스레드 재사용을 시작할 때까지 작동해야합니다.

+0

당신이 할 수 있다는 것을 알지 못해서 감사합니다.하지만 워크 플로우 패키지를 사용하고 있기 때문에 스레드 이름 그 자체를 실제로 제어 할 수는 없습니다. – Risser

1

Thread의 이름을 현재 트랜잭션 ID에 매핑하는 글로벌 액세스 가능 Map을 만들 수 있습니다. 새 작업을 시작할 때 해당 트랜잭션에 대한 GUID를 생성하고 스레드가 Map에 등록되도록합니다. 동일한 작업을 수행하기 위해 동일한 Thread을 생성하십시오. 그런 다음 무언가를 기록해야하는 경우 현재 Thread의 이름을 기반으로 글로벌 Map에서 거래 ID를 간단히 조회 할 수 있습니다. (약간의 kludgy,하지만 작동해야합니다)

+0

나는 스레드의 실제 세대를 보지 못한다는 것을 제외하고는이 아이디어가 마음에 든다. 워크 플로우 패키지 덕분에 제 손에서 벗어났습니다. – Risser

+0

이 아이디어를 확장하기 위해 여기서 제안되는 것은 기록 된 이벤트를 스레드별로 대기열에 대기시키는 것입니다. 처리 중에 * 어떤 지점 *에서 트랜잭션 id를 알면 대기중인 모든 로그 이벤트와 연관시킬 수 있습니다. 많은 수의 로그 이벤트를 생성하는 경우이 '대기열'은 여전히 ​​파일 시스템에있을 수 있으며 사후 처리 단계를 사용하여 threadId -> transactionId를 변환합니다. –

0

로깅하는 경우, 당신은 어떤 종류의 로거 개체가 있어야합니다. 각 스레드에 spearate 인스턴스가 있어야합니다.

  • setID (String id)라는 메서드를 추가하십시오.
  • 스레드에서 초기화 될 때이 메서드를 사용하여 고유 한 ID를 설정하십시오.
  • 각 로그 항목 앞에 iD 세트를 붙입니다.
0

새로 생성 된 스레드가 어떻게 든 트랜잭션 ID가 무엇인지 알고있는 답변을 제안했습니다. 내가 뭔가를 놓치지 않는 한,이 ID를 새롭게 생성 된 스레드로 가져 오기 위해 스레드를 생성하는 메서드로 줄을 통과시켜야합니다.

나는이 코드를 전달할 필요가 없다고 생각하지만, 이러한 스레드로 작업을 전달하는 책임이있는 코드는 전달할 transactionID가 있어야합니다. 작업 지정자가 이미 이것을 갖고 있지 않습니까?

1

이것은 AspectJ crosscuts의 완벽한 예입니다. 호출되는 메소드를 알고 있다면 인터셉터를 넣고 동적으로 바인드 할 수 있습니다.당신이 당신의 거래 log4jMDCNDC 클래스와 현재의 thread에 추가 정보를 바인딩 대처 방법을 살펴, 하나 이상의 스레드에 걸쳐 언급 그러나

이 문서는 당신에게 몇 가지 옵션 http://www.ibm.com/developerworks/java/library/j-logging/