suyeonme

[Spring Boot] 로그(Log) 본문

프로그래밍👩🏻‍💻/Spring

[Spring Boot] 로그(Log)

suyeonme 2022. 11. 8. 23:01

로그를 남기는 이유

  • 운영환경에서 어플리케이션에서 문제가 발생한 경우 원인 파악을 하기 위해서는 문제가 발생했을 당시의 정보가 필요하다. 따라서 Exception이 발생했거나, 중요 기능이 실행되는 부분에서는 로그를 남긴다.
  • 로그는 재현하기 힘든 버그에 대한 정보를 제공한다.
  • 로그는 성능에 관한 통계와 정보를 제공한다.

로그 사용시 장점

  • 쓰레드 정보, 클래스 이름등 부가 정보를 출력할 수 있고 출력 포맷을 조정할 수 있다.
  • 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력, 운영 서버에서는 특정 레벨 이상의 로그만 출력하는등의 조절을 할 수 있다.
  • 시스템 아웃 콘솔에 출력 및 파일이나 네트워크등 별도의 위치에 로그를 남길 수 있다.(파일 분할, 파일 압축등)
  • 내부 버퍼링, 멀티스레드등 측면에서 성능이 System.out보다 좋다.

로그 라이브러리

log4j --> logback --> log4j2 순서대로 등장하였다. 

SLF4J(Simple Log Facade for Java)는 수많은 라이브러리를 통합하여 인터페이스로 제공하는 라이브러리이다. 즉 slf4j는 인터페이스, logback, log4j2는 구현체 라이브러리이다.

  • log4j (2015년 개발 중단)
  • logback: 스프링부트에서 기본으로 사용
  • log4j2: 가장 최신 라이브러리 (권장)

로그 레벨

레벨 설명
FATAL  
ERROR 오류를 핸들링하는 시점에 사용
WARN 동작에는 문제없지만 문제가 발생 가능한 경우
INFO 서비스, 도메인의 시나리오 상태, 지표등 메타 정보 기록
DEBUG 개발시 디버깅 용도

로그 작성 예시

BAD

  • log.debug(”data=” + data);
  • 문자 더하기 연산 발생(레벨이 낮아서 로깅하지 않는 경우에도)

GOOD

  • log.debug(”data={}”, data);
  • 파라미터로 넘겨서 출력하기 때문에 연산이 발생하지 않음
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class LogController {
	private final Logger log = LoggerFactory.getLogger(getClass());

	public String logging() {
		log.trace("info log={}", name);
		log.debug("info log={}", name);
		log.info("info log={}", name);
		log.warn("info log={}", name);
		log.error("info log={}", name);
	}
}

롬복의 @Slf4j 어노테이션 사용

롬복에서 제공하는 @Slf4j 어노테이션을 사용하면 위 코드를 아래와 같이 간결하게 사용할 수 있다.

@Slf4j
@RestController
public class LogController {
	public String logging() {
		log.info("info log={}", name);
	}
}

프로젝트/패키지별 로그 레벨 설정

application.properties파일에 아래와 같이 작성하면 프로젝트에서 발생하는 로그의 레벨에 따라서 로깅 여부를 지정할 수 있다.

예를 들어, WARN으로 레벨을 지정하면 WARN 이상인 로그가 발생했을 때에만 로깅을 한다.

  • 개발기: debug
  • 운영기: info
// 전체 로그 레벨 설정(기본 info)
logging.level.root=info

// hello.springmvc 패키지와 그 하위 로그 레벨
logging.level.hello.springmvc=trace // 로그 전체 레벨
logging.level.hello.springmvc=warn // WARN과 그 이상 레벨

IntelliJ 플러그인

Comments