문제

다음과 같은 log4j 사용자,우리는 종종 디버그 수준을 기록하는 비싼 평가합니다.그래서 우리는 이러한 경우는 다음과 같은 코드를 사용:

if( _logger.isDebugEnabled )
  _logger.debug("Interesting, my foojes are goofed up: " + getFullDetails())

그러나,그것은 더 이상 일반 _logger.디버그 호출하고,때로는 프로그래머를 실현하지 않는 평가 비싼 수 있습니다.

그것은 매우 간단해야에 쓰는 프로그램 컴파일된 jar 및 경비원은 모든 _logger.디버그 전화로 isDebugEnabled 확인합니다.우리는 가능성이 기꺼이 받아들여 추가의 오버헤드를 확인하 isDebugEnabled 는 경우도 있습니다.

는 사람이 접근,또는 유사한 수행 후공정의 항아리입니까?

도움이 되었습니까?

해결책

당신은 보 AspectJ ?이 지원하는 측면을 사용하여 바이트코드 직물 및할 수 있는 도청 으로 이전에 컴파일합니다.jar 파일.

다른 팁

오히려 이상을 보고 수정하는 항아리,나는 검색을 사용하여 솔루션 바이트코드 계측.문제를 식별하는 것입니다 그 부분의 코드에 당신을 감싸는 내부 .isDebugEnabled() -당신은있는 개체를 식별하는을 위한 용도로만 사용되 log4j 호출.

내가 믿고 좋은 해결책이 될 것입 코드는 것이 효율적으로.

고 log4j 은 사용되지 않습니다.의 저자는 자신은 왼쪽으로 그것입을 방지하기 위해,호환성을 파괴하지만,그가 만든 새로운 하나,SLF4J(http://www.slf4j.org/ ).그는 모두 제공합관 및 구현,따라 구분 commons-logging/log4j,그러나 없이 결함의 각...

내가 믿는 것,이는 새로운 로깅 기능,을 보낼 수 있는 개체 매개변수를 로깅,그리고 그 수준을 평가하기 전에 변환의체(문자열이나 그렇지 않으면).아이디어가 사용하는 형식 문자열과 매개 변수입니다.


우리의 코드를 사용하지 않 slf4j 지만,우리는 유틸리티는 방법을 정확하게 할 것.그것은 코드를 대행(메모리):

    public enum LogLevel {
       FATAL, ERROR, WARNING, INFO, DEBUG;

       public void log(Logger logger, String format, Object... parameters) {
         if (isEnabled(logger)) {
            logImpl(logger, String.format(format, parameters));
         }
       }
       public boolean isEnabled(Logger logger) {
         switch(this) {
           case WARNING : return logger.isWarningEnabled();
           case INFO : return logger.isInfoEnabled();
           case DEBUG : return logger.isDebugEnabled();
           default: return true;
         }
       }
       private void logImpl(Logger logger, String message) {
         switch(this) {
           case WARNING : logger.warn(message);
           // other cases
         }
       }
    }

그것은으로 사용:

     public void myMethod(Object param) {
       LogLevel.WARNING.log(LOGGER, "What is my message ....", "myMethod", param);
     }

업데이트 :해야 하는 경우 호출하는 방법 로그의...

  • 하나의 가능성은 사용 toString 방법입니다.이는 적절한 의 경우 로깅을'기술', 고,또한 사용될 때는 디버깅할 수 있습니다.

  • 의 경우 로깅할 수 있습니다. (지 않을 타겟으로 개발자),제안을 정의하는 인터페이스(그것이 기능적으로 사운드에 있는 경우,그래서 그것은을 제공하는 데 유용 의미):

    public interface Detailable { // the name could also suggest logging?
      String getFullDetails();
    }
    

    를 구현하는 인터페이스에 있는 모든 개체가 전달되어야 합 로그로 복잡한 계산을 구축하는 로그에 있습니다.

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