평소 input과 output의 확인을 위해서 System.out.println() 같은 콘솔을 통해 확인하는 방법을 사용한다.
하지만, 이는 결국 리소스를 사용해야하므로, 실무나 운영시스템에서는 사용하지 않는다.
우리는 input과 output을 사용하기 위해 logging을 사용할 수 있다.
package hello.springmvc.basic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //RestController는 return하는 값을 바로 띄워준다.
public class LogTestController {
//log를 다루기 위헤 log객체 생성
private final Logger log = LoggerFactory.getLogger(getClass());
//localhost:8080/log-test 요청 시 이 로직 실행
@RequestMapping("/log-test")
public String logTest(){
String name = "Spring";
System.out.println("name = " + name);
log.info("info log={}", name);
return "ok";
}
}
위의 코드를 살펴보자.
private final Logger log = LoggerFactory.getLogger(getClass());
-> LoggerFactory: 로그를 생성하고 관리하는 데 사용되는 클래스
-> getLogger(getClass())를 통해 현재 클래스의 로그를 관리하는 logger를 생성한다.
즉, 현재 클래스에서 로그를 다룰 수 있게 되었다.
RequestMapping을 통해 localhost:8080/log-test를 요청 시 위의 로직을 실행할 수 있게 하였다.
실행 시 {}부분에 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);
위를 보면 info 이외에도 여러 상황의 로그를 남길 수 있다.
1. trace: 주석과 같은 느낌이다. java 애플리케이션에서 메시지를 로그에 기록하는데 사용된다.
2. debug: 오류나 문제를 찾아서 수정할 때(유지보수 시) 오류를 해결할 수 있는 실마리를 주는 데 사용된다.
3. info: 작동 상태등 여러가지를 기록하는데 사용된다.
4. warn: 잠재적인 문제 발생. 애플리케이션은 warn이 떠도 계속 실행될 수 있다.
5. error: 오류나 예외 발생 시 사용된다.
어? trace와 debug가 없는 것을 볼 수 있다.
application.properties에 들어가서
logging.level.hello.springmvc=trace
를 입력해주면 trace까지 다 뜬다. (trace는 무시 가능하기 때문에 보통 안뜬다.)
위의 각 로그들은 1,2,3,4,5의 레벨을 갖고 = 다음에 trace를 써주면 1~5까지 로그들이 나온다.
ex)warn을 써주면 4,5인 warn과 error가 나온다. -주로, info부터 보는것을 기억하자.
@Slf4j
위의 에노테이션은 롬복에 포함되어있는 에노테이션이다.
private final Logger log = LoggerFactory.getLogger(getClass()); 이 한줄을 @Slf4j를 사용함으로 대신해줄 수 있다.
이를 사용하기 위해 설정을 해주어야한다.
1.설정을 들어간다.
2.Annotation Processors에 들어가
3. checkbox를 체크해주자.
4. 의존성에 lombok이 추가가 되어있어야 한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.projectlombok:lombok:1.18.28'
implementation 'org.projectlombok:lombok:1.18.28'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
이를 다 충족한다면,
package hello.springmvc.basic;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController //RestController는 return하는 값을 바로 띄워준다.
public class LogTestController {
//log를 다루기 위헤 log객체 생성
//private final Logger log = LoggerFactory.getLogger(getClass());
//localhost:8080/log-test 요청 시 이 로직 실행
@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";
}
}
private final Logger log = LoggerFactory.getLogger(getClass()); 를 안쓰고, @Slf4j 써주면 된다.
올바른 로그 사용법
log.info("info log="+name); VS log.info("info log={}", name);
딱 보면 비슷해서 아무거나 써도 될듯하다.
하지만, +를 사용한 앞의 코드는 쓰레기이다!
log.trace("info log="+name)
-> 자바는 한 코드가 실행되기 전, 연산을 하고 그 결과를 기억한 후 출력해준다.
->연산 후 출력
->trace는 낮은 레벨이라 볼 필요가 없을 때
->굳이 출력을 안해도 되는데, +연산이 일어남("info log=name"으로 기억해둔다.)
->그냥 +연산만 일어나고 출력도 안됨.
VS
log.trace("info log={}", name)
->연산이 안일어남
->출력하고 싶을 때, 파라미터로 전달 후 출력해줌
한 애플리케이션에서는 무수한 log가 있는데, 그 모든 안보는 로그도 연산을 일일이 하고 있으면,
성능이 저하된다.
(중요하니 꼭 기억할것)
로그의 장점
1. 파일로 로그를 남길 수 있다.
2. 각 서버마다 로그의 범위를 정할 수 있다.
<본 글은 김영한님의 강의를 듣고 작성되었습니다.>
'스프링 프레임 워크' 카테고리의 다른 글
스프링 mvc의 전체적인 동작 과정(argument resolver, returnvalue handler) (0) | 2023.10.10 |
---|---|
HTTP 응답 다루기(HTML-정적, 동적) (0) | 2023.10.09 |
HTTP 요청 메시지(데이터를 다루기) (0) | 2023.10.05 |
HTTP 요청 파라미터(데이터를 다루기) (0) | 2023.09.27 |
요청 매핑 (0) | 2023.09.19 |