우당탕탕 개발일지

[Logging] 로깅라이브러리 - Logback이란? 본문

개발

[Logging] 로깅라이브러리 - Logback이란?

kyunge_ev 2022. 11. 14. 21:37

 로깅(logging)이란? 

  • 애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간순으로 기록하는 것
  • 비기능 요구사항 → 사용자나 고객에게는 불필요한 기능
  • 디버깅하거나 개발 이후 발생한 문제를 해결할 때 원인을 분석하는 요소

 로깅라이브러리 - Logback 

  • log4j 이후 출시 된 로깅 프레임워크 중 하나로 slf4j를 기반으로 구현(slf4j를 구현체로 사용)
  • 스프링 부트의 spring-boot-starter-web 라이브러리 내부에 내장돼 있어 별도 의존성을 추가하지 않아도 사용가능
  • 크게 5개의 로그 레벨을 설정할 수 있음(가장 많이 사용 되는 것은 INFO)
    • 로그 레벨을 남기는 이유? 기록이 너무 많이 남으면 보기 힘듦

      ERROR : 로직 수행 중에 시스템에 심각한 문제가 발생해서 애플리케이션의 작동이 불가능한 경우
      WARN : 시스템 에러의 원인이 될 수 있는 경고 레벨
      INFO : 애플리케이션의 상태 변경과 같은 정보 전달을 위해 사용
      DEBUG : 애플리케이션의 디버깅을 위한 메시지를 표시
      TRACE : DEBUG 레벨보다 더 상세한 메시지를 표현

 

 

  • 실제 운영 환경과 개발 환경에서 각각 다른 출력 레벨을 설정해서 로그를 확인할 수 있음
  • Logback의 설정 파일을 일정 시간마다 스캔해서 애플리케이션을 재가동하지 않아도 설정을 변경할 수 있음
  • 별도의 프로그램 지원 없이도 자체적으로 로그 파일을 압축할 수 있음
  • 저장된 로그 파일에 대한 보관 기간 등을 설정해서 관리할 수 있음

Logback 설정 

▶ Spring, 일반 JAVA 프로그램일 경우

  • logback.xml 파일을 resources 디렉토리에 만들어 참조

▶ Springboot의 경우

  • logback-spring.xml 파일을 resources 디렉토리에 만들어 참조
  • 간단히 application.properties에 값만 세팅해도 설정 가능
logging.level.root=debug // 기본값은 INFO

logging.level.com.springboot.hello.controller=debug // 패키지 별로도 설정 가능

// application.yml 일 경우
logging:
	level:
		root: debug

→ 단, 로그를 너무 많이 남기면 용량이 금방 차버리기 때문에 Rolling을 함
limit을 정해놓고 오래 된 로그부터 지우는 것

 로그 기록 남기는 방법 

  • Controller의 클래스 명 위에 @Slf4j 어노테이션을 달아줌
  • 각 Mapping 안에 log.info(”원하는 로그 내용”); 입력
    • url에 값을 받아오는 GetMapping 인 경우
      log.info(”원하는 로그 내용. varialbe:{}”, varialbe); 로 입력 가능
  • @Data : 가져오려는 클래스 위에 해당 어노테이션을 사용하여 객체주소가 아닌 값을 확인할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RestController
@RequestMapping("/api/v1/get-api")
@Slf4j // 로그 어노테이션 사용
public class GetController {
 
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello(){
    log.info("hello로 요청이 들어왔습니다."); // 남길 내용 입력
    return "Hello World";
}
 
@GetMapping(value = "/name")
public String getName() {
    log.info("getName으로 요청이 들어왔습니다.");
    return "minkyoung";
}
 
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
    log.info("getVariable1으로 요청이 들어왔습니다. variable:{}", variable);
    return variable;
}
cs