[SPRING] SLF4j을 사용한 로깅방법
로직 작성 시 로그를 남길 수 있는 간단한 방법을 기록합니다.
스프링부트 로깅 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 함께 포함된다.
로그라이브러리는 로그를 파일로 생성하거나 특정 메일로 보내주는 등의 다양한 기능을 제공하지만
이 글에선 콘솔에 로그를 출력하는 기능만 정리합니다.
스프링 부트 로깅라이브러리는 기본으로 다음 로깅 라이브러리를 사용합니다.
- SLF4J
- LogBack
다양한 로그 라이브러리(LogBack, Log4J, Log4J2)가 있는데
그것을 통합해서 인터페이스로 제공하는 것이 SLF4J 라이브러리이다.
SLF4J가 인터페이스가 되고 그 구현체로 LogBack, Log4J2 같은 라이브러리를 선택하여 사용하면된다.
스프링부트는 기본적으로 LogBack을 사용한다.
System.out.println()으로 로그를 남길수도있지만 로깅라이브러리를 사용하면 다양한 기능을 사용할 수 있다.
로그 선언
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j //Lombook
public class LogTest {
// 두개의 방법중 하나를 선택하여 사용
private final Logger log = LogFactory.getLogger(getClass());
private final Logger log2 = LogFactory.getLogger(LogTest.class);
}
slf4j의 Logger 객체를 생성하며 log, log2의 호출방식에 차이가 있지만 두 객체는 동일하다.
Lombook의 @Slf4j를 사용하면 위의 Logger 객체 생성과정을 생략할 수 있다.
로그 레벨 설정
application.properties파일에서 전체 혹은 특정 패키지의 로그레벨을 설정할 수 있다.
로그 호출
로그레벨을 지정하여 호출할 수 있다. 이 덕분에 운영서버에서 출력할 로그를 관리할 수 있다.
@RequestMapping("/log-test")
public String logTest() {
String name = "Spring";
System.out.println(name);
log.trace("trace log={}", name);
log.debug("debug log={}", name);
log.info(" info log={}", name);
log.warn(" warn log={}", name);
log.error("error log={}", name);
return "ok";
}
String.format 처럼 log의 두번째 파라미터가 괄호안에 출력된다.
여러개일 경우 그 개수만큼 괄호를 추가해주면된다.
로그레벨별로 출력을 하기때문에 시스템에 설정된 로그보다 레벨이 낮은 로그는 출력되지않는다.
시스템콘솔로 출력한 로그는 단순히 텍스트만 출력됐으나 로그를 사용하면 다양한 정보가 함께 출력되는걸 확인할 수 있다.
올바른 로그사용
log.debug("log msg =" + msg);
괄호를 사용하지 않고 문자 더하기 연산으로 출력을 한다면 어떨까?
괄호 안의 문자 더하기 연산을 수행하고 로그 레벨을 확인하기 때문에 만일 로그레벨이 debug이상이라면
연산만 수행하고 로그를 출력하지않는다.(불필요한 연산 발생)
그렇기에 괄호를 사용한 로그 출력을 사용해야한다.
로그사용의 이점
1. 시스템콘솔은 단순히 텍스트만 출력되지만 로그를 사용하면 시간, 로그레벨, 클래스명등 다양한 정보를 제공받는다.
2. 로그레벨에 따라 개발 서버에는 모든 로그를 출력하고 운영서버에는 출력하지 않는 등의 상황에 맞는
로그 관리가 가능하다.
3. 콘솔뿐 아니라 파일이나 네트워크 등 로그를 별도의 위치에 기록 가능하다.
4. 성능이 System.out 보다 좋다.