출처 : http://planmaster.tistory.com/66


원래 Log4J 에서는

LOG.debug("error Message");

이렇게 쓰면 debug 메소드 내에서 현재의 Log Level 을 확인해서 
메세지를 출력할지 말지가 결정된다.


그런데 Log4J 를 사용하는 코드를 보면

if (LOG.isDebugEnabled()) {
    LOG.debug("error Message");
}

이렇게 미리 체크하여 쓰는것을 심심찮게 볼 수 있다.

분명히 이중 체크가 되는데.. 왜 이렇게 하는것일까..?


현재의 로그 레벨이 INFO 라고 가정하고 보자.

대부분 디버그용 에러 메세지는

    int value1 = 50;
    int value2 = 100;
    
    LOG.debug("value 1="  + value1 + ", value2=" + value2);

이런식으로 많이 사용하게 되는데

이때 체크를 미리 하지 않는다면 먼저 "value 1="  + value1 + ", value2=" + value2 의 String 연산이 일어난다.
그리고 debug 메소드 내에서 현재 레벨이 INFO 이므로 출력을 하지 않도록 결정하고 리턴된다.

자바에서는 String이 immutable 이므로 + 연산이 일어날때 마다 새로운 String 객체가 생성되는 오버헤드가 발생되게 된다.

하나의 debug 문장이 큰 영향을 미치지는 않을수 있지만
1000개 짜리 배열을 루핑을 돌면서 디버그 문장을 남긴다고 해보자.

// largeArray 라는 배열에 1000개의 데이타가 삽입되어있다 가정하고..

for(int i=0; i<largeArray.length; i++) {
    LOG.debug("index : "  + i + ", value : " + largeArray[i]);
}

이렇게 하는것과

boolean isDebugEnabled = LOG.isDebugEnabled();
for(int i=0; i<largeArray.length; i++) {
    if (isDebugEnabled) {
        LOG.debug("index : "  + i + ", value : " + largeArray[i]);
    }
}

이렇게 LOG.isDebugEnabled()로 체크 해주는것은 성능이나 리소스면에서 큰차이를 보일수 있게 된다.


경우에 따라선 크지 않을수도 있지만 습관적으로 체크 하도록 하는것이 더 좋겠다.


참고로.. 예는 가장많이 쓰게되는 debug로 들었으며.. 다른 Log Level 에 대한 체크도 포함된다.

isDebugEnabled()
isErrorEnabled()
isFatalEnabled()
isInfoEnabled()
isTraceEnabled()
isWarnEnabled()

'Java > Explain' 카테고리의 다른 글

파싱(Parsing)을 배워보자! 1편  (0) 2017.06.26
접근제한자.  (0) 2017.06.24
[Java] Serialize (객체 직렬화)  (0) 2015.11.20

+ Recent posts