문제

다른 지점에서 호출되는 다중 스레드 데이터 액세스 계층이 있는 Java 계층형 애플리케이션이 있습니다.이 계층에 대한 단일 호출은 DB에 대한 요청을 병렬화하기 위해 여러 스레드를 생성할 가능성이 높습니다.

내가 찾고 있는 것은 다양한 스레드로 구성된 "활동"을 정의할 수 있는 로깅 도구입니다.따라서 데이터 액세스 계층의 동일한 메서드는 호출자에 따라 다른 출력을 기록해야 합니다.총 운영 비용을 요약하기 위해 다양한 결과를 그룹화하는 기능도 중요합니다.

애플리케이션은 Java로 작성되었지만 언어는 제한 사항이 아닙니다.나에게 필요한 것은 결국 그것을 구현하기 위한 디자인 지침입니다.현재 log4j를 사용하고 있지만 여기서는 이 동작을 얻을 수 없습니다.

도움이 되었습니까?

해결책

당신은 또한 살펴 봐야합니다 중첩된 진단 컨텍스트 log4j의 특징다양한 발신자에 대해 다양한 컨텍스트를 로거에 푸시하면 도움이 될 수 있습니다.

다른 팁

로거를 전달할 수 있어야 하므로 작업 데이터에 대한 "공통"을 기반으로 로거를 생성합니다.사용자 이름 등그런 다음 이 로거를 필요한 모든 메소드에 매개변수로 전달하십시오.이렇게 하면 log4j 구성 파일에서 다양한 필터 및/또는 규칙을 설정할 수 있습니다.또는 로거 이름을 기준으로 출력 파일을 스크랩합니다.

편집하다:또한 log4j에서 MDC 및 NDC 클래스를 확인하세요.여기에 컨텍스트 데이터를 추가할 수 있습니다.

log4j에서는 "%t" 패턴을 사용하여 스레드 이름을 기록할 수 있습니다.보다 log4j 패턴 레이아웃.

내 (웹) 애플리케이션 중 하나에서 로깅 정보를 StringBuilder로 캡처하는 ThreadLocal 로거를 사용합니다.로거 객체는 추적 매개변수가 설정된 경우 HttpServlet#service 메소드에서 초기화됩니다(설정되지 않은 경우 매우 빠른 널 로거가 있음).결과 출력은 요청 페이지에 HTML 주석으로 덤프되거나 한 세그먼트의 로그 파일에 기록됩니다.

Java5(이상)에서는 다음을 호출할 수 있습니다.

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

원하는 깊이까지 스택 추적을 검사하고 그에 따라 기록합니다.

Java 1.4에서는 다음과 같은 정보를 얻을 수 있습니다.

StackTraceElement[] stackTrace = new Exception().getStackTrace();

내 생각에 로거 개체를 스레드와 연결하고 싶습니다.각 스레드에 대한 log4j 로거 인스턴스를 보유하는 ThreadLocal 변수가 도움이 될 수 있습니다.

http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html

현재 "활동"을 식별하는 데이터 액세스 계층에 일부 구조를 전달해야 합니다.이미 "Activity" 클래스가 있을 수 있으며, Logger 인스턴스를 다음과 같이 사용할 수도 있습니다. 써니가 제안했어요 또는 활동 컨텍스트를 추적하기 위해 세 번째 구조를 사용할 수도 있습니다.

어쨌든 "활동"은 여러 스레드에서 처리되므로 대부분의 다른 현재 답변에서 제안하는 것처럼 현재 "활동"을 추적하기 위해 thread-local-storage를 사용할 수 없습니다.명시적으로 전달해야 합니다.

나는 다음과 같은 메소드로 인터페이스를 확장하는 log4j 위에 작은 외관을 만드는 것을 제안합니다.

void debug(Activity activity, String message);

데이터 액세스 계층에서 활동 컨텍스트를 여기에 전달합니다.

현재 활동을 전달할 수 있도록 데이터 액세스 계층을 일부 수정해야 하지만 최선의 방법은 현재 인터페이스에 따라 크게 달라집니다.Workspace 패턴을 사용하는 경우 Workspace 클래스에 setActivity() 메서드만 추가하면 되지만 다른 인터페이스 패턴에서는 모든 메서드에 Activity 매개변수를 추가해야 할 수도 있습니다.

어떤 이유로든 데이터 액세스 레이어를 변경할 수 없거나 변경할 의사가 없는 경우 데이터 액세스 레이어를 호출하기 전에 활동 컨텍스트를 thread-local-storage에 저장하고 하위 스레드를 생성하거나 인큐하기 직전에 이를 검색할 수 있습니다. 데이터 액세스 계층의 작업.그것은 실행 가능한 해결책이지만 그런 식으로 정보를 전달하는 것은 약간 위험합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top