log_기본
1. 로깅 라이브러리
스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 함께 포함된다.
스프링 부트 로깅 라이브러리는 기본으로 다음 로깅 라이브러리를 사용한다.
· SLF4J
· Logback
로그 라이브러리는 Logback, Log4J, Log4J2 등등 수많은 라이브러리가 있는데 그것을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J라이브러리다.
즉, SLF4J는 인터페이스이고, 그 구현체가 Logback이다.
실무에서는 스프링 부트가 기본으로 제공하는 Logback을 대부분 사용한다.
2. log 사용 기본
로그는 아래와 같이 로그 인스턴스를 생성해 사용해야 하지만 롬북을 이용하면 이 과정을 생략하고 log 인스턴스를 편하게 사용할 수 있다.
private Logger log = LoggerFactory.getLogger(getClass());
위의 과정을 @Sl4j 애노테이션을 클래스에 붙이는 것으로 생략할 수 있다.
로그의 기본적인 사용은 아래 예제에서 확인할 수 있다.
[각 레벨별 출력]
@Slf4j
@RestController
public class LogTestController {
@RequestMapping("/log-test")
public String logTest() {
String name = "Spring";
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);
//로그를 사용하지 않아도 a+b 계산 로직이 먼저 실행됨, 이런 방식으로 사용하면 X
log.debug("String concat log=" + name);
return "ok";
}
}
로그 레벨은 다음과 같은 관계를 따른다.
TRACE > DEBUG > INFO > WARN > ERROR
보통 개발 서버는 debug까지, 운영 서버는 info까지 출력한다.
로그는 log.레벨("문자열={}", 변수) 의 형식으로 사용한다. 변수는 {} 부분에 대체돼서 출력된다.
+연산을 사용해도 문자는 붙어서 출력된다. 하지만 로그 레벨에 의해 출력이 되지 않을 때도 +연산은 실행되기 때문에 경우에 따라 낭비가 심할 수 있다.
따라서 log를 쓸 때는 +연산보다 {}, 변수의 형식을 쓰는 게 권장된다.
[로그 결과]
2021-07-06 17:41:42.055 DEBUG 14852 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : debug log=Spring
2021-07-06 17:41:42.056 WARN 14852 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : warn log=Spring
2021-07-06 17:41:42.056 ERROR 14852 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : error log=Spring
2021-07-06 17:41:42.056 INFO 14852 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : info log=Spring
로그로 출력되는 포맷은 다음과 같다.
시간, 로그 레벨, 프로세스, ID, 쓰레드 명, 클래스 명, 로그 메시지
[로그 레벨 설정]
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=debug
application.properties에서 위와 같이 로그 레벨을 설정할 수 있다.
전체 적용도 가능하고, 특정 패키지 별로 적용할 수도 있다.
3. 로그 사용 시 장점
로그 사용시 다음과 같은 장점이 있다.
· 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
· 로그 레벨에 따라 로그 출력을 선택할 수 있다.
· 시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다.
· System.out보다 성능이 좋다.
댓글