2011-07-06 6 views
0

저는 많은 메시지 에이전트의 기본 클래스 인 com.example.BaseMessagingAgent 클래스와 함께 메시지 기반 시스템을 가지고 있습니다. 이 기본 클래스는 메시지 이벤트를 기록합니다. 이 기본 클래스에는 시스템의 다른 특정 에이전트를 구현하는 많은 하위 클래스가 있습니다. Com.example.BaseMessagingAgent를 확장 한 com.example.MyAgent가 그 중 하나입니다.log4j의 하위 클래스 필터링하기

MyAgent 클래스에만 관련된 메시지 만 로깅하려고합니다. 하지만이 같은 기록을 정의 할 수 없습니다 :

log4j.logger.com.example.MyAgent=DEBUG, APPENDER 

로깅이 부모 클래스 com.example.BasicMessagingAgent 발생하기 때문에 - 나는 아무것도 기록하지 않습니다.

그리고 나는 또한 기본 클래스에서 로깅을 설정하지 않으 :

log4j.logger.com.example.BaseMessagingAgent=DEBUG, APPENDER 

는 모든 에이전트에 대한 이벤트를 기록합니다, 나는 불필요한 로깅을 많이 가지고 있기 때문에.

로깅을 하나의 하위 클래스로만 제한하는 방법을 알고 있습니까?

+1

코드에서 로거를 어떻게 정의합니까? 공전? –

+0

이것은 세 번째 회사 코드입니다. 나 .class 파일 만있다. – Nulldevice

답변

0

실제로 매우 간단합니다.

먼저 루트 로거에 appender를 추가하십시오. 정말. 그것은 당신의 삶을 훨씬 더 단순하게 만들 것입니다.

지금 전체를 구성합니다 ". com *"

log4j.rootLogger=DEBUG, APPENDER 
log4j.logger.com=ERROR 
log4j.logger.com.example.MyAgent=DEBUG 

아래의 모든 클래스에 대한 기본에만 오류를 기록하는 것입니다. 유일한 예외는 디버그 수준에서 기록 할 com.example.MyAgent입니다.

루트 로거를 DEBUG으로 설정해야합니다. 그렇지 않으면 모든 DEBUG 로그 메시지가 삭제됩니다.

다음 단계는 인스턴스 당 하나의 로거를 사용하는 것입니다. 그것을 얻으려면, 단순히 당신이 당신의 로거를 만들 줄에 static를 제거하고 내가 아는 getClass()

BaseMessagingAgent 교체, 그것은 잔인한 사람처럼 보이지만 그 방법의 log4j 작품입니다. 또한 초 당 MyAgent 수백만을 만들지 않는 한 인스턴스 당 로거를 만드는 것은 그리 비싸지 않습니다.

appender를 단일 클래스에 추가하려면 추가 성을 해제하는 것을 잊지 마십시오 (...Class.additivity=false). 그렇지 않으면 모든 로그 메시지가 두 번 표시됩니다.

+2

여기서 핵심은 코드의 로거 선언에서 정적을 제거하는 것이지만 @Nulldevice는 타사 코드로 작업하고 있다고 생각합니다. –

+0

디 컴파일하십시오. 한 줄만 고쳐야합니다. 바보조차도 새 버전에 수정 사항을 적용하기 위해 빌드 할 수있는 프로젝트를 생성하십시오. 다른 모든 것이 실패하면 ASM 또는 유사한 도구를 사용하여 바이트 코드에서 "정적"플래그를 필터링하십시오. –