6월, 2011의 게시물 표시

자바 로깅

간만에 Java Programming을 다시 시작했는데 Spring3.0을 보니 로깅이 모두 slf4j로 바뀌어져 있다. 음.. 그렇다. 요즘은 slf4j를 사용한다. 그럼 어떤 장점이 있어서 slf4j가 대세가 되었을까. commons-logging으로 로그를 남길 때 보통 아래 처럼 하게 된다. log.debug("리턴값을 로그로 남겨 봐야지~ 리턴값: [ " + abc(id) + "]" ); 위 코드는 무엇이 문제일까? 로깅레벨 설정을 error로 켜두면 debug 코드는 안찍는다. 하지만 비록 로그에 남지 않는다고 하더라고 실행은 된다. String끼리 더하기 연산도 실행되고 abc() 함수도 호출한다. 즉, 쓸 때없이 자원을 낭비하는게 첫번째 문제이다. 그래서 다음과 같이 할 수 있다. if (log.isDebugEnabled()) {     log.debug("리턴값을 로그로 남겨 봐야지~ 리턴값: [ " + abc(id) + "]"  ); } if(log.isDebugEnabled())를 집어 넣어서 로그 레벨이 debug가 아니라면 아예 건너뛰게 만들었다. log.isDebugEnabled()를 실행하는것도 리소스를 잡아 먹긴 하지만 부담이 큰 작업은 아니다. 하지만 이런식으로 하게 되면 코드가 지저분해진다. 게다가 로깅레벨이 여러단계일 때 if 문이 중첩될 수 있는 문제가 있다. 또 다른 문제는 로그 레벨이 debug로 설정되어 있을 때 발생한다. 로그 레벨이 debug일 때  if (log.isDebugEnabled())는 무의미한 코드가 되어 버린다. 작지만 리소스 낭비다. slf4j를 사용하면 아래처럼 바꿀 수 있다. log.debug("리턴값을 로그로 남겨 봐야지~ 리턴값: [ {} ]", abc(id)); 로그를 찍든 안찍든 String을 일단 더하고 보는 것과는 처리 방식이 다르다. {} 에는 abc(id)의 리턴값이 들어간다.