출처 : 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 |