개발자들은 어플리케이션의 중심부에 통합 로깅을 구성하여, 개발시 문제점 추적이나 필요한 부분을 모니터링 하려고 할 것이다.
System.out.println() 을 열심히 붙여 넣으면 로깅이 가능하다.
조금더 진보적인 방법으로는 Logging Framework 를 사용하는 방법이 있다.
Logging Framework 의 종류는 매우 많겠지만, 대부분 사용하는 것은 정해져 있는 듯 하다.
JUL, Log4j, Logback 정도...
Spring Framework 은 기본적으로 spring-core 모듈이 JCL(Jakarta Commons Logging) API 에 의존성을 가지고 있다.
commons-logging 의 역할은 지정된 클래스패스에서 다른 Logging Framework 를 찾아 동일한 API 로 로깅을 구현할 수 있게 한다.
예를 들면 Log4j 같은 Logging Framework 와 연동시켜 logging 을 가능하게 한다.
사용 가능한 Logging Framework 가 없다면 JDK 의 JUL(java.util.logging) 을 기본으로 사용한다.
문제는 commons-logging 이 slf4j 에 비해 비효율적이라는데 있다.
slf4j 는 commons-logging 처럼 다른 Logging Framework 를 찾는 작업을 런타임시 하지 않고, 컴파일 시점에 바인딩하기 때문에 더 효율적이다.
이러한 효율성이 얼마나 체감 가능한지는 모르겠지만 아무튼 그러한 이유로 slf4j 를 많이 사용한다고 한다.
Log4j 도 런타임 오버헤드와 코드 사이즈가 증가하는 단점으로 인해, slf4j API 를 구현하는 Logback 을 주로 사용한다.
JUL, JCL, Log4j 등을 호출하는 외부 라이브러리 이용시에는 slf4j 의 extend 라이브러리(jcl-over-slf4j 등) 를 사용하면 slf4j 로 통합된다.
정리하자면, commons-logging 이나 slf4j 같은 Logging API 를 사용하는 이유는,
JUL 이든 Log4j 든 Logback 이든 개발 도중 Logging Framework 가 바껴도 Logging 에 관련된 코드를 수정할 필요가 없도록 하기 위해서이다.
slf4j + logback 인 logging 을 위해 dependancy 에 추가할 것은 세가지 정도가 되겠다.
- slf4j Logging API
- logback Logging Framework
- Binding to slf4j : jul-over-slf4j / jcl-over-slf4j / log4j-over-slf4j / ...
Gradle 을 예로 들면, 다음과 같은 형태가 되겠다.
dependencies { // logback-classic (slf4j-api, logback-core 포함) compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3' compile group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.25' compile group: 'org.slf4j', name: 'log4j-over-slf4j', version: '1.7.25' } | cs |
마지막으로 resources 디렉토리에 적당한 logback.xml 나 logback.groovy 파일을 생성/설정한다. ^^
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.