2013-03-17 3 views
0

추적 할 공용 메서드가 두 개 있습니다. 메서드 중 하나가 다른 메서드를 반복적으로 호출합니다. 제가하고 싶은 것은 외부에서 호출 된 메소드 만 추적하는 것입니다. 여기 로깅 메시지를 동적으로 건너 뜁니다.

가 무슨 뜻인지 설명하는 간단한 클래스의 : 다른 곳에서 내 코드에서
public class LoggingExample { 
    private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class); 
    public static final String USER_ROOT = "/home/waisbrot"; 

    /** could be called by fileExistsRobust *or* from outside */ 
    public static boolean fileExists(String filename) { 
     logger.trace("Checking for file {}", filename); 
     File f = new File(filename); 
     return f.exists(); 
    } 

    /** always gets called from outside */ 
    public static boolean fileExistsRobust(String filename) { 
     logger.trace("Checking for any varient of {}", filename); 
     if (fileExists(filename)) 
      return true; 
     for (String prefix : prefixes) { // this list is 100 items long 
      if (fileExists(prefix + filename)); 
       return true; 
     } 
     return false; 
    } 
} 

, 나는 나는 그것의 로깅 메시지가 인쇄 취득하는 경우 fileExists를 호출 할 수 있습니다 (I 그것을 추적하고있어 가정) . 하지만 보다 전화를 걸면 로그 메시지가 표시되지만 fileExists은 표시되지 않습니다.

두 방법을 모두 추적하고 싶지만 두 번째 방법을 호출 할 때 출력에 묻혀 있습니다. 내가 원하는 것을 이해하기 위해 Logback을 구성 할 수 있었으면 좋겠다. 그러나 문서에서 유용한 것이 아무것도 없다. 내가 fileExistsRobust을 입력하고 fileExists에서 테스트 할 때 깃발을 넘길 수는 있지만 (정적 메서드이기 때문에) 하나 이상의 스레드와 추악해질 것입니다. 그리고 많은 로깅 인프라로 클래스를 오염시키기 시작한 것처럼 보입니다. MDC를 사용하여 정보를 저장할 수는 있지만 MDC의 남용과 같습니다.

누구나 전에이 상황에 처해 있습니까? 어떻게 처리 했지?

답변

1

코드를 변경할 수 있다고 가정합니다. 그리고 제 생각에 가장 간단한 방법은 로깅 켜고 끌과 fileExists (문자열 파일 이름) 다른 internalFileExists(String filename)를 도입하거나 오버로드하여 문제를 피할 수있다 :

public static boolean fileExists(String filename, boolean doLog) { 
    if (doLog) logger.trace("Checking for file {}", filename); 
    File f = new File(filename); 
    return f.exists(); 
} 

하고, fileExistsRobust가 도로 그 = 거짓과 오버로드 된 버전을 사용할 수 있도록 단일 인수하면서 버전은 fileExists (filename, true)로 리디렉션됩니다.

실제로 문제를 해결하지는 않지만 해결해줍니다.

+0

나는 당신이 먼저 언급 한 사적 내부 솔루션을 좋아한다. –

관련 문제