로그(log) ?
기록
을 남기는 것
프로그램 개발
이나 운영
시 발생하는 문제점
을 추적
하거나 운영 상태
를 모니터링
하는 정보를 기록
기록 데이터
를 분석
하여 다양한 통계
에 사용할 수 있음
운영 시스템
에서는 System.out.println()
같은 시스템 콘솔을 출력하지 않고
별도
의 로깅 라이브러리
를 사용
스프링 부트 라이브러리
를 사용
하면 스프링 부트 로킹 라이브러리(spring-boot-starter-logging)
이 포함됨
로깅 라이브러리
[ 설명 ]
스프링 부트 로킹 라이브러리(spring-boot-starter-logging)
가 사용하는 기본 로깅 라이브러리
Slf4j
: 다양한 로깅 라이브러리를 통합해서 인터페이스로 제공
하는 것
Logback
: 실제 로깅 라이브러리의 구현체 역할
(실제 실무에서도 기본적으로 적용
하는 Slf4j + Logback 조합
을 대부분 사용)
[ 특징 ]
( Log Level )
- Log Level
ERROR
: 요청을 처리하는 중 오류가 발생
한 경우
WARN
: 처리 가능한 문제
지만, 향후 시스템 에러의 원인
이 될 수 있는 경우
INFO
: 로그인이나 상태 변경과 같은 정보성 메시지
DEBUG
: 개발 시 디버깅 목적
으로 출력
TRACE
: DEBUG 레벨
보다 좀 더 상세한 메시지
- 로그의
출력 레벨
은 5가지
로 존재
개발 단계
에서는 주로 DEBUG (혹은 그 위 level)
운영 단계
에서는 주로 INFO (혹은 그 위 level)
- ex)
INFO 지정
--> INFO
/ WARN
/ ERROR
모두 출력
- ex)
DEBUG 지정
--> DEBUG
/ INFO
/ WARN
/ ERROR
모두 출력
Log Level 설정
은 application.properties
에서 가능
(기본 전체 log level
은 info
로 설정되어 있음)
# 전체 로그 레벨 설정 (default = info)
logging.level.root=info
# 특정 패키지 로그 레벨 설정
logging.level.hello.springmvc=debug
( 올바른 사용법 )
+
을 통해 문자열을 조합
해서 출력
하는 것은 +
연산이 먼저 수행
된 후에 출력여부
를 결정
--> 결국 출력하지 않아도 연산을 수행
하기 때문에 비용
이 든다
--> +
연산을 통한 출력 대신 {}
라는 치환문자
를 통해서 출력
해야 한다
# 올바르지 못한 방법
log.info("info log = " + info);
# 올바른 방법
log.info("info log = {}", info);
[ 사용 ]
( Logger 가져오기 )
- 직접 가져오기
: private final Logger log = LoggerFactory.getLogger(getClass());
@Slf4j
사용
: 롬복의 @Slf4j
를 사용하면 바로 log
라는 이름으로 logger를 사용할 수 있음
( log 찍기 )
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());
@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);
log.debug("String concat log=" + name);
return "ok";
}
}
[ 장점 ]
쓰레드 정보
/ 클래스 이름
같은 부가 정보
를 함께 볼 수 있으며, 출력 모양 조정 가능
로그 레벨
에 따라 상황에 맞추어 로그 출력
가능
개발 서버
--> 모든 로그 출력
운영 서버
--> 로그 출력 X
콘솔
뿐만 아니라 파일
/ 네트워크
등 로그를 별도의 위치
에 남길 수 있다.
--> 특히 파일
로 남길 때에는 일별 / 특정 용량
에 따라 로그를 분할
할 수도 있음
성능
도 일반 System.out보다 좋다
--> 내부 버퍼링
/ 멀티 쓰레드
등등