자바에는 기본적으로 내장된 로깅 유틸리티가 존재한다.
java.util.logging 에 들어있는데, 여기에는 총 7개 레벨의 구분된 로깅을 제공한다.
SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST
왼쪽부터 highest value → lowest value 이다.
문제는 이 유틸리티가 1.4에서부터 나왔는데 이때는 이미 log4j라는 라이브러리가 잘 알려져 널리 사용하고 있어 굳이 jul을 사용할 필요가 없었다.
그리고 다른 라이브러리와 비교를 했을 때 속도도 느리며 Predefine된 레벨의 개념이 명확하지 않다라는 단점이 있다.
일반적인 사용자가 FINE, FINER, FINEST가 어떨때 사용하는지 알 수 있을까?
private static final Logger logger = Logger.getLogger(Application.class.getName());
logger.info("new Logger");
logger.log("log");
2020년 기준 log4j2가 나와 이 후에 제작된 프로젝트라면 log4j2를 사용하는게 좋다.
이유는 지속적인 유지보수와 기능 추가가 이루어지고있지만, log4j는 유지보수만을 가지고 있는데, 굳이 무리해서 log4j2로 넘어갈 필요는 없다.
log4j는 3개의 컴포넌트로 이루어져 있다.
logger, appender, layout
logger
는 데이터를 기록하는 역할을 하며 appender
는 데이터를 어디에 기록할지, layout
은 어떤 스타일로 데이터를 기록할지 저장하는 역할을 한다.
private static Logger logger = LogManager.getLogger(Application.class);
logger.info("info logger");
logger.debug("list debug logger : ", list.size());
이는 다른 라이브러리와의 차이점은 wrapper라는 것이다.
Wrapper ?
이는, 다른 기본형 타입을 객체로 사용해야 할때 사용되는 데이터 타입이다.
Slf4J는 Logging Framework에 대해 추상화가 되어있다. 그렇기 때문에 Slf4J를 단독으로 사용하지는 않는다.
이게 무슨소리인지 자세히 살펴보자면 Slf4J를 이용해서 개발을 할 때는 Slf4J 를 이용해서 로깅이 되는것처럼 보인다. 하지만, 설정에 따라 배포 시 Slf4J는 (Logback, Log4J, jul)중 바인딩된 Logging Framewkork가 실제 로깅 코드를 수행한다는 점이 있다.
즉, Logging Framework를 유연하게 사용할 수 있다는 것이다.