2013-01-01 2 views
0

웹 클라이언트의 요청을 받아들이고 계산을 수행하고 결과를 다시 보내는 Java 서버가 있습니다 (Java 용 Socket.IO 기반,하지만 그 부분은 아닙니다). .로깅 특정 기능 호출 특정 로그 호출

서버는 로깅을 위해 log4j를 사용하는 일부 라이브러리를 사용합니다.

계산이 오래되었으므로 최종 결과뿐 아니라 로그도 클라이언트에 보내려고합니다.

물론 각 클라이언트에게 요청과 관련된 로그 행만 보내려합니다.

내 질문은 : 특정 기능 호출 중에 생성 된 모든 로그가 특정 로거로 이동하도록 log4j를 구성하려면 어떻게해야합니까?

+0

이 가능한 소리가 나지 않는다하여 Log4j가 작성해야 할 사전에 파일 기술자를 알 수 없을 것이기 때문에, 여기 제안 된대로
이상적으로 나는 또한,이 목적을 위해 내 자신의 log4j 로거를 써서 로그. 프로그래밍 방식으로 만 수행 할 수있는 것처럼 보이지만 log4j API에는이를위한 도구가 있습니다. – fge

+0

좋아요, 그럼 어떻게하면 응용 프로그램을 멀티 스레드로 유지하면서 프로그래밍 방식으로이 작업을 수행 할 수 있습니까? –

답변

3

예, 가능합니다. 첫 번째로 MDC (매핑 진단 컨텍스트) 개념에 익숙해 져야합니다. 기본적으로 스레드 별 로깅 컨텍스트 (읽기 - 해시 맵)를 저장하는 곳입니다. log4j는 MDC 값에 따라 로깅 출력을 다른 대상으로 보내도록 구성 할 수 있으므로 각 사용자의 로그 출력을 사용자 이름의 파일로 보낼 수 있습니다. 그래서 장시간 작업을 시작할 때 MDC에 사용자 이름 (또는 일부 식별자)을 설정하면 모든 작업 로깅이 구성된 로거에 따라 특정 위치 (파일)로 이동 한 다음 MDC를 지 웁니다. op가 끝나면.

MDC herehere을 사용하는 데 필요한 2 부 튜토리얼이 있습니다. Using MDC in log4j to dynamically name the log file

+0

"긴 작업을 시작할 때 MDC에 사용자 이름 (또는 일부 식별자)을 설정하면 작업의 모든 로깅이 구성된 로거에 따라 특정 위치 (파일)로 이동 한 다음 작업이 완료되면 MDC를 지 웁니다. " 그러나 이것은 두 개의 작업자 스레드에서 병렬로 긴 작업의 두 인스턴스를 실행할 수 없음을 의미합니다. –

+1

물론 MDC는 스레드 로컬이므로 2 명의 다른 사용자에 대해 2 개의 TX가 발생하면 로깅은 다른 파일로 이동합니다. TX (단일 사용자 용)에서 스레딩을 원할 경우 MDC를 작성한 새 스레드로 옮겨야합니다. 같은 사용자로 2 개 이상의 TX를 병렬로 연결하려면 MDC에 user + some unique TX id를 넣고 사용자 값뿐만 아니라 사용자 +에 의해 출력을 그룹화하는 자신의 appender를 작성해야합니다. tx id – radai

+0

완벽하게 작동합니다. 감사합니다! –