로깅
운영에서는 System.out.println 대신 별도의 로깅 라이브러리를 사용한다.
스프링 부트를 사용하면 spring-boot-starter-logging 라이브러리가 포함된다.
스프링 부트 로깅 라이브러리가 기본으로 사용하는 라이브러리
slf4j
logback, log4j 등 다양한 라이브러리를 통합해 인터페이스로 제공하는 라이브러리
logback
실제 로깅 구현체
로그 선언
// import 할 때 인터페이스인 slf4j인지 꼭 확인한다.
import org.slf4j.Logger;
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());
}
import org.slf4j.Logger;
@RestController
public class LogTestController {
// 사용하는 클래스를 직접 지정해줄 수도 있다.
private final Logger log = LoggerFactory.getLogger(LogTestController.class);
}
@Slf4j
class Example {
}
코드나 롬복으로 사용할 수 있다.
// Controller라고 하면 View 이름을 반환하고
// Restcontroller로 하면 "ok"라는 스트링이 그대로 반환된다.
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/log-test")
public String logTest() {
String name = "Spring";
System.out.println("name = " + 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";
}
}
매핑 정보
@Controller
반환값이 String이면 뷰 이름으로 인식된다.
뷰를 찾고 뷰가 렌더링 된다.
@RestController
HTTP 메시지 바디에 바로 입력한다.
@ResponseBody와 관련있다.
로그 포맷
시간
로그 레벨
프로세스 ID
스레드 명
클래스 명
로그 메시지

log로 찍은 데이터는 시간, 스레드, 컨트롤러 등 자세한 정보와 함께 출력된다.
기본 설정에서는 info, warn, error만 출력된다.
로그 레벨
trace > debug > info > warn > error
보통 개발 서버는 debug, 운영 서버는 info로 출력한다.
기본값은 info 레벨로 되어있다.
warn, error가 포함된다.
# 전체 로그 레벨 설정
# 오만가지 로그가 다 쌓이게 된다.
logging.level.root=info
# hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=trace

properties에 trace로 설정을 해주면 trace와 debug도 출력된다.
trace는 빼고 debug만 보고 싶으면 properties에 debug로 설정한다.
올바른 로그 사용법
class Example {
public void example() {
// 잘못된 예
log.debug("data = " + data);
// 올바른 예
log.debug("data = {}", data);
}
}
+로 하면 더하기 연산이 실행된다.
심지어 log.debug이면 debug 레벨이 아니더라도 일단 연산을 하고 본다.
{}로 하면 그런 일이 발생하지 않는다.
log 사용의 장점
스레드 정보, 클래스 이름 같은 부가 정보를 볼 수 있다.
출력 모양을 조정할 수 있다.
환경에 따라 로그 레벨을 조절할 수 있다.
로그 레벨을 코드가 아니라 설정으로 변경할 수 있다.
System.out은 콘솔에만 남지만 log는 파일, 네트워크 등 별도의 위치에 로그를 남길 수 있다.
파일의 경우 날짜, 용량에 따라 로그를 분할할 수도 있다.
성능도 System.out보다 좋다.
내부 버퍼링, 멀티 스레드 등 성능 최적화가 다 되어있어 로그가 한 번에 많이 와도 잘 해결해준다.
실무에서는 꼭 log를 사용해야 한다.
Reference
Last updated
Was this helpful?