본문 바로가기
JAVA & Spring

[Spring] Log 출력 및 총 정리

by 알기 쉬운 코딩 사전 2024. 1. 18.
반응형

📄 Log란?

서버 컴퓨터의 운영 단계에서 기록된 데이터를 출력한 후 별도로 저장을 하기 위해 System.out.println 대신에 사용하는 것입니다.

 

📄 다양한 Log 선언 방법

순수 JAVA로 Log 선언

@RestController
public class LogTestController {

//@Slf4j 어노테이션으로 Log 선언 시 생략 가능
    private final Logger log = LoggerFactory.getLogger(getClass());

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

        System.out.println("name = " + name);

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

        return "ok";
    }
}

 
 
결과 화면

 

@Slf4j 어노테이션으로 Log 선언(Lombok 라이브러리 추가 시 사용 가능)

@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);

        return "ok";
    }
}

 
결과 화면

참고: 순수 JAVA로 Log 선언 코드와 어노테이션으로 Log 선언 코드는 같은 코드입니다.
하지만 어노테이션을 사용할 시 DI 멤버 변수 선언을 생략할 수 있습니다.
참고: SLF4J 라이브러리는 인터페이스, 실제 구현체는 Logback입니다.
구현체의 종류는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있습니다.

 

📄 Log 레벨의 종류

  • trace
  • debug  ( 개발 단계 )
  • info ( 운영 단계 )
  • warn
  • error
참고: log.debug의 경우에는 개발 단계에 많이 사용 되며,
log.info의 경우에는 실제 운영 단계에서 많이 사용됩니다.

 

📄 Log 사용시 장점

  • 시간, 로그 레벨, PID(프로세스 ID), 쓰레드 정보, 클래스 정보 등을 조정할 수 있습니다.
    [ 날짜 ] [ Log 레벨 ] [ PID ] --- [ 쓰레드 정보 ] 클래스 정보 : [ Log 출력물 ]
인텔리제이에서의 log 출력 화면

 

  • 개발 서버에서의 로그와 운영 서버에서의 로그를 상황에 맞게 조절할 수 있습니다.
    또한 패키지 별로 로그 레벨을 다르게 설정할 수 있습니다.

application.properties

#전체 로그 레벨 설정(기본 info)
logging.level.root=info

#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=trace

 

  • 파일이나 네트워크 등 로그를 별도의 위치에 남길 수 있습니다.
    특히 파일로 로그를 남길 경우에는 날짜별, 용량별로 로그를 분할할 수 있습니다.
  • System.out.println보다 성능적으로 좋습니다.

 

📄 올바른 Log 사용 방법

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

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

//    올바른 Log 사용 방법 🟢
        log.info(" info log={}", name);

//    틀린 Log 사용 방법 ❌
        log.info(" info log" + name);

        return "ok";
    }
}
참고: 로그 출력 레벨을 info로 설정해도 해당 코드에 있는 " info log=" + name이 실제 실행이 되어 버립니다.
결과적으 로 + 연산이 발생하여 메모리의 낭비가 발생합니다.
따라서 로그를 출력할 때에는 log.info(" info log={}", name) 형식으로 사용해야합니다.

 

📄 변수 2개 이상 출력 방법

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

    @RequestMapping("/log-test")
    public String logTest(){
        String name = "Spring";
        int age = 21;

        log.info("name={}, age={}", name, age);
        
        return "ok";
    }
}
반응형

댓글