서비스를 개발하고 테스트를 할 때, 그 로직이 잘 동작하는지를 확인하는 방법은 다양하다. 그 중에서 나는 보통 출력문 하나를 넣어서 잘 출력이 되는지를 확인하고는 했는데, 이러한 방식은 실무에서 사용하지 않고 사용을 권장하지 않는다.
그래서 출력문이 아닌 별도의 로깅 라이브러리를 사용해 로그를 출력하는데, 이 로깅 라이브러리의 종류가 매우 많다. 그래서 몇 개의 예시를 통해 정리해보고자 한다.
@RestController
public class LogTestController {
// 이 코드는 로그를 선언하는 방법이다.
private final Logger log = LoggerFactory.getLogger(getClass());
// 5번라인의 로그 선언 방법 외에도 아래 2개의 방법이 있다.
private static final Logger log = LoggerFactory.getLogger(Xxx.class)
@Slf4j
지금 코드를 보면 로그를 확인하기 위해 5번라인과 8번라인 처럼 선언을 해줘야 로그를 볼 수 있는데,
그러지말고 롬복에서 제공하는 @Slf4j 어노테이션을 사용하면 선언한 것과 같이 log() 메소드를 이용할 수 있다.
@RequestMapping("/log-test")
public String logTest(){
String name = "Spring";
System.out.println("name = "+name);
log.info("info log={}", name);
return "ok";
// RestController 이용 시 return 값을 그냥 콱하고 박아버림
}
}
이러한 코드가 있다고 가정해보자. 직접 코드를 작성해서 출력해보면 콘솔창에 이렇게 출력이 될 것이다.
눈으로 봐도 명확한 차이가 존재한다. 로그를 통해 출력을 하게 되면 출력문과 다르게 더욱 다양한 정보가 출력이 된다.
학습 내용을 정리하면 다음과 같다.
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);
로그에도 레벨이 있다. trace ~ error까지 있는데, 가장 높은 레벨은 trace이며, 위에 있는 코드에 이 코드를 추가해서 출력해보면 info, warn, error 만 출력이 된다. info부터 출력이 되는 이유는 기본 설정값이 info이기 때문이다. 특정 패키지 말고 전체 패키지의 기본 설정값을 바꿀 수 있는데, 이 기본 설정값을 바꾸게 되면, 엄청나게 많은 로그가 찍힐 수 있다.
이 말은 결국 지금 스프링에서 실행중인 모든 파일마다 로그 level이 설정 되어있음을 의미하고 있다.
(서버마다 다르게 로그 레벨을 설정해서 확인할 수 있다. 실제로도 그렇게 많이 사용한다고 한다.)
하지만 내가 로그를 다 보고싶다면? application.properties의 파일에서 log를 설정해주면 되는데, 설정법은 다음과 같다.
logging.level.패키지 위치= 단계 설정 (trace ~ error)
로그를 사용할 때 주의점이 있다
log.info(" info log={}", name);
log.info(" info log="+name)
과연 이 두개의 로그는 어떻게 출력이 될까?
결과는 똑같이 출력이 된다. 하지만 아래의 방식인 +name을 사용해서는 안 된다!
왜? 이유는?? 바로 연산에 있다. 결국 불필요한 연산 때문에 리소스 낭비가 일어난다.
정리를 해보면 로그를 출력할 때 출력문을 통해서 동작을 확인하는 것보다, 로그를 통해서 확인하는 것이 성능이슈 면에서도 좋고, 더욱 다양한 정보를 얻을 수 있다. 또한 설정만으로 상황에 맞게 조절할 수 있다. 또한 설정을 통해 로그를 파일로 남길 수 있다.
해당 공부는 인프런의 김영한님의 스프링 MVC 1편 中 로깅 간단히 알아보기 챕터를 학습한 후 정리한 내용입니다.
'스프링 > 백엔드' 카테고리의 다른 글
@Transactional 그리고 트랜잭션 (1) | 2023.08.16 |
---|---|
Repository와 Service (0) | 2022.06.12 |
REST API 기초와 사용법 (2022.12.08 추가) (0) | 2022.03.28 |
InteliJ-Spring boot-dependencies (0) | 2022.03.09 |
스프링 부트의 테스트 코드(부제 : JUnit), 책: 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (0) | 2022.02.10 |