2013-10-17 2 views
0

레거시 로깅 클래스가 있습니다. 그것의 정적 로거 참조 (로거라는)와 정적 메서드를 잔뜩 있어요.FileAppenders on the fly

각 메소드는 String 입력을 받아서 System.out.println에 기록하고 logger가 null이 아니면 로거에 기록합니다.

로거를 초기화하는 생성자가 있습니다. 그러나이 생성자는 패키지 범위만을 가지고 있으며 어디에서나 호출되지 않는다고 확신합니다. 따라서 로거는 항상 null이고 클래스는 기본적으로 System.out.println 만 실행합니다.

각 스레드가 고유 한 FileAppender에 쓰는 다중 스레드 응용 프로그램에서 사용할 수 있도록이 값을 변경하려고합니다.

그리고 그것이 내가 붙어있는 곳입니다.

기본적으로,이 정적 클래스는 여러 log4j FileAppenders와 관련되어 있습니다. 각 FileAppender는 Thread에 의해 생성 될 수 있으며 파일 이름은 Thread에 알려진 고유 한 정보에서 파생 될 수 있습니다.

내가 할 수없는 방법은 마술처럼 Log4j를 사용하여 해당 스레드의 고유 FileAppender를이 레거시 로깅 클래스에 전달하는 것입니다.

아이디어가 있으십니까? 힌트? 제안?

마크

답변

0

그것은 동적으로 RoutingAppender과 ThreadContext 맵을 사용하여 대상 로그 파일 이름을 변경할 수 있습니다.

이 모든 작업은 구성 (스레드가 FileAppenders를 만드는 사용자 지정 코드가 필요 없음)을 사용하여 수행 할 수 있습니다. RoutingAppender 구성에서 대상 FileAppender를 전환하는 데 사용할 ThreadContext 키를 지정할 수 있습니다. 예를 들어 "ROUTINGKEY"문자열을 사용할 수 있습니다. 각 thread는, 열쇠 "ROUTINGKEY"에 대한 ThreadContext 맵에 유일한 값을 넣습니다.이 값은 로그 이벤트가 라우트되는 Appender를 선택하는 데 사용됩니다. 파일 이름에 ROUTINGKEY 값이있는 로그 파일을 동적으로 작성하도록 설정할 수도 있으므로 모든 대상 로그 파일을 사전에 알아야 할 필요는 없습니다.

FAQ 페이지는 좋은 예입니다. http://logging.apache.org/log4j/2.x/faq.html#separate_log_files