2013-12-17 2 views
3

로거의 경우 모든 로거에 대해 매개 변수 생성 비용이 숨겨져 있다고합니다.log4j v2 형식 지정 기능

예 -

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); 

이 관계없이 메시지가 될 것이다 여부 즉, 메시지 파라미터를 구성하는 I 및 항목 [I]는 문자열을 모두 정수로 변환하고, 중간 문자열을 연결하는 비용을 초래 기록 여부. 이 매개 변수 구성 비용은 상당히 높을 수 있으며 매개 변수의 크기에 따라 달라집니다.

log 4j 사이트에서 매개 변수 생성 비용을 피하는 가장 좋은 방법은 Log4j 2의 형식 지정 기능을 사용하는 것입니다. 예를 들어, 위의 대신에 쓰기 :

logger.debug("Entry number: {} is {}", i, entry[i]); 

이 시간 내에 발생한 비용은이 서식 기능 내에서 발생합니다. 그것은 이전의 경우에 생성하는 데 사용되는 것처럼 문자열을 생성하지 않습니까? 누군가 설명해 주시겠습니까?

답변

1

첫 번째 예에서는 필요하지 않더라도 문자열을 생성합니다. 그러나 필요한 경우 가장 효율적인 방법입니다. BTW String.valueOf은 중복됩니다.

두 번째 옵션은 메시지가 꺼져 있으면 빠릅니다. 이렇게하면 나중에 문자열을 생성하기 전에 디버깅이 활성화되었는지 여부를 확인할 수 있으므로 String을 생성하지 않아도됩니다. 참고 : String이 필요하면 메시지 형식을 구문 분석해야하므로 속도가 느려질 수 있습니다.

두 세계의 최고,하지만 wordest이 경우

if(logger.isDebugEnabled()) 
    logger.debug("Entry number: " + i + " is " + entry[i]); 

, 당신은 체크를하고 그것을 기록 할 경우, 가장 빠른 메시지 생성을 얻는다.


는 문자열을 만들지 않도록 당신이 처음에 꺼 디버깅 설정하지 않아도 충분히 빠르다 프레임 워크가 로그인되어 있지만, 이것들은 사용이 간단하지 않고, 당신이 필요로하지 않는 한 내가 그들을 피할 것 더 많은 성능.

+0

제 첫 번째 쿼리는 logger.debug에서 3 개의 인수를 전달하는 두 번째 옵션에서 사용 된 변경된 메서드에 대한 것입니다.이 메서드는 이러한 인수를 어떻게 처리 할 것입니까? log4j v2의 포맷팅 기능에서 새로운 점 두 번째로, 매개 변수를 작성하기 전에 두 번째 경우에 로거는 디버그 모드 사용 여부를 점검합니다. –