2014-11-12 5 views
1

가 나는 기록이 구문을 사용하는 일반적인 이유 로깅 에 대한 간단한 질문이 있습니다로깅 구문에 대한 자세한

LOG.debug("invalidate {}",_clusterId); 

을하지이 :

LOG.debug("invalidate" + _clusterId); 

답변

0

예를 들어, 로깅 수준을 INFO로 설정했다고 가정하십시오. 디버그 수준의 메시지를 완전히 무시하고 싶습니다. 그러나 log 메소드는 메소드가 입력 될 때까지 매개 변수를 얻은 후에 로그 레벨을 점검 할 수 없습니다. 따라서 매개 변수가 필요한지 여부를 모르는 경우 매개 변수를 평가하지 않아도되는 것이 좋습니다.

로깅이 info로 설정되어 있어도 _clusterId에서 toString이 호출되면 그 결과 문자열이 앞의 문자열과 연결됩니다. 그런 다음 메소드가 입력되면 로거는 디버그 레벨이 로깅 할 필요가 없다는 것을 알게되고 새로 생성 된 문자열을 버리고 메소드를 종료합니다.

첫 번째 예제에서는 디버그 수준 로깅을 사용하지 않으면 _clusterId가 toString을 호출하지 않고 로그 메시지가 작성되지 않습니다. toString을 호출하면 속도가 느려지거나 쓰레기가 생성 될 수 있습니다. 어쨌든 아무 것도 기록되지 않는 경우에는 toString을 사용하지 않는 것이 좋습니다.

public void debug(Object message, Throwable t) { 
    if(repository.isDisabled(Level.DEBUG_INT)) 
    return; 

    if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) 
    forcedLog(FQCN, Level.DEBUG, message, t); 
} 
: 여기

은 (로거의 슈퍼 클래스입니다)의 log4j의 org.apache.log4j.Category에 디버그 방법에 대한 소스 코드의
0

당신은 몇 가지 매개 변수를 사용하여 문이있을 때 패턴을 매개 변수 다음에 문자열로 쓰면 코드가 더 읽기 쉽습니다. 또한 많은 임시 문자열 객체를 불필요하게 만드는 것을 피하면서 더 효율적일 수 있지만 로깅 프레임 워크가 내부적으로 보간을 구현하는 방법에 따라 다릅니다.

첫 번째 사항을 보려면 문자열 연결을 사용하는 해당 줄과 비교하십시오.

LOG.debug("{}: Error {} while processing {} at stage {}", currentFile, 
     exception.getMessage(), operation.getName(), operation.getStage()) 

매개 변수가 하나 뿐인 경우 일반적으로 사용하는 매개 변수와 별개로 사용하는 매개 변수는 실제로 중요하지 않습니다.