본문 바로가기

Spring/Spring

[Spring] 로깅 알아보기

반응형

우리가 일반적으로 출력문을 사용할 때 System.out.print를 사용했지만 실무에서는 이것을 사용하지 않고 로그로 출력을 한다. 그 이유는 시간, 쓰레드, 컨트롤러 등 다양한 정보를 알 수 있고 출력을 할 때 단순히 콘솔이 아니라 네트워크, 파일로 출력을 할 수도 있다. 

 

@RestController
public class LogTestController {
    private final Logger log = LoggerFactory.getLogger(getClass()); // 내 클래스를 지정하기

    @RequestMapping("/log-test")
    public String logTest() {
        String name = "spring";

        System.out.println("hi hello");
        log.info("info log = ", name);

        return "ok";
    }
}

여기서 @RestController는 @Controller와 달리 view 이름이 반환되는 것이 아니라 문자가 그대로 반환이 된다.

즉, http 메시지 바디에 문자를 그대로 넣어버릴 수 있어서 테스트할 때 간단하게 쓸 수 있다.

 

일반적인 System.out.println 출력문과 로그 출력문을 비교했을 때 로그로 출력을 하면 시간, 인포, 쓰레드, 컨트롤러 이름까지 출력이 되는 것을 볼 수 있다.

 

@RestController
public class LogTestController {
    private final Logger log = LoggerFactory.getLogger(getClass()); // 내 클래스를 재정하기

    @RequestMapping("/log-test")
    public String logTest() {
        String name = "spring";

        System.out.println("hi hello");

        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";
    }
}

로그로 확인할 수 있는 기능들을 추가한 코드이다.

주로 개발 서버는 debug, 운영 서버는 info를 주로 사용한다.

 

여기서 코드를 더 간단히 하고 싶으면 @slf4j 애너테이션을 추가하면 된다.

위 코드와 비교해보면  private final Logger log 부분을 선언 안 해도 작동이 되는 것을 알 수 있다.

@Slf4j
@RestController
public class LogTestController {
 

    @RequestMapping("/log-test")
    public String logTest() {
        String name = "spring";

        System.out.println("hi hello");

        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";
    }
}

 

로그의 올바른 사용법

로그 출력을 + 연산자로 하면 어떻게 될까?

예를 들어서

log.trace("trace log = {}", name);

 

log.trace("trace log = " + name);

위의 코드를 아래로 바꾸게 되면 자바 언어 특성상 메서드 호출보다 + 연산이 더 먼저 일어나게 된다.

그냥 단순히 출력 방식의 차이 아닌가? 라고 생각이 들 수 있지만 만약 우리가 log를 볼 때 trace는 안 보고 info, warn만 보려고 한다고 가정한다면 + 연산을 이용하면 사용자가 출력하지도 않는데 쓸데없는 + 연산이 되어서 메모리 낭비가 되는 셈이다. 쓸데없는 메모리, cpu 낭비는 좋지 않으니 로그를 사용할 때는 + 연산을 사용하지 말자.

반응형