본문 바로가기
JAVA & Spring

[Spring] Log 출력 및 총 정리

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

📄 Log란?

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

 


 

 System.out.println 대신에 Log를 사용하는 이유?

1. 로그 레벨(Log Levels) 제공
Log를 사용하면 로그를 단계(Levels) 별로 관리할 수 있습니다.

2. 로그 출력 관리
System.out.println은 콘솔에 출력됩니다.
하지만 Log의 경우에는 출력한 후 File로 별도로 저장하도록 설정하여 로그 파일을 날짜별, 용량별로 분할할 수 있습니다.

3. 성능 최적화
System.out.println보다 성능적으로 좋습니다.

4. 다양한 기능 제공
로그 포맷팅
: 시간, 로그 레벨, PID(프로세스 ID), 쓰레드 정보, 클래스 정보 등을 조정할 수 있습니다.
로그 필터링: 특정 레벨 이상의 로그만 출력하거나, 특정 패키지의 로그를 제외할 수 있습니다.

 


 

📄 다양한 Log 선언 방법

  • 순수 Java로 Log 선언
  • @Slf4j 어노테이션으로 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 Levels)의 종류

  • trace: 매우 상세한 디버깅 정보
  • debug: 디버깅을 위한 정보( 개발 단계 )
  • info: 일반적인 실행 정보를 나타냄( 운영 단계 )
  • warn: 주의가 필요한 상황
  • error: 에러가 발생했을 때
  • fatal: 심각한 오류로 인해 애플리케이션이 중단될 수 있는 상황
 log.debug의 경우에는 개발 단계에 많이 사용 되며, log.info의 경우에는 실제 운영 단계에서 많이 사용됩니다.
참고: 사용자의 중요한 정보는 절대 Log에 기록하지 않습니다.

 


 

📄 로그 포맷팅

시간, 로그 레벨, PID(프로세스 ID), 쓰레드 정보, 클래스 정보 등을 조정할 수 있습니다.

[ 날짜 ] [ Log 레벨 ] [ PID ] --- [ 쓰레드 정보 ] 클래스 정보 : [ Log 출력물 ]

 


 

📄 필터링

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

 

application.properties

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

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

 


 

📄 올바른 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";
    }
}
반응형

댓글