➡️ 로깅(logging)이란?
- 정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동이다.
- 프린트 줄 넣기(printlning)는 간단한, 보통은 일시적인, 로그를 생성하기만 한다.
- 시스템 설계자들은 시스템의 복잡성 때문에 로그를 이해하고 사용해야 한다.
- 로그가 제공하는 정보의 양은, 이상적으로는 프로그램이 실행되는 중에도, 설정 가능해야한다.
- 일반적인 로그 기록의 이점
- 로그는 재현하기 힘든 버그에 대한 유용한 정보를 제공할 수 있다.
- 로그는 성능에 관한 통계와 정보를 제공할 수 있다.
- 설정이 가능할 때, 로그는 예기치 못한 특정 문제들을 디버그하기 위해, 그 문제들을 처리하도록 코드를 수정하여 다시 적용하지 않아도, 일반적인 정보를 갈무리할 수 있게 한다.
➡️로그를 출력하는 방법
- System.out.println()을 사용한다
- 로깅 라이브러리를 사용한다.
로그 라이브러리는 Logback,Log4j,Log4J2등등 많은 라이브러리가 있는데,그것을 통합해서 제공하는 것이 바로 SLF4J 라이브러리이다.
SLF4J는 인터페이스고, 그 구현체로 Logback같은 로그 라이브러리를 선택하면 된다.
스프링 부트는 기본으로 SLF4J와 logback을 로깅 라이브러리를 사용한다.
➡️로그 사용법
로그 선언
1
2
3
|
private Logger log = LoggerFactory.getLogger(getClass());
private static final Logger log = LoggerFactory.getLogger(XXX.class);
|
cs |
위 두가지 방법이 라이브러리를 쓸때 일반적인 방법이다.
그러나 스프링부트를 사용하면서 롬복을 추가 하면 더욱더 간단하게 로그 선언을 할 수 있다.
롬복 로그선언 :@SLF4J
세 가지 방법 모두 다 동일하다.스프링 부트를 사용한다면 롬복으로 선언하는게 조금 더 편리해 보인다.
로그 호출
1
2
3
|
log.info("info log ={}",name);
System.out.println("info log ={}",name);
|
cs |
위 두가지 방법이 있다.시스템 콘솔로 직접 출력하는거 보다 로그를 사용하는것이 좋다.
로그를 호출할 때 되도록이면 System.out.println은 사용을 하지 않는것이 좋다. 성능 차이가 너무 확연하게 난다.
간단한 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@RestController
@Slf4j
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";
}
}
|
cs |
이 처럼 사용하면 콘솔창에 로그가 찍힌다.
이렇게 보면 확실히 System.out.println보다 깔끔하고 정확하게 확인 할 수 있다.
로그가 출력되는 순서대로 시간, 로그,레벨, 프로세스 ID,쓰레드 명,클래스명,로그메시지이다.
로그 레벨
- 로그를 출력할 때 로그 레벨을 설정해서 원하는 레벨까지의 로그만을 출력 할 수 있다.
- 로그 레벨 : TRACE ->DEBUG ->INFO->WARN ->ERROR
- 개발 서버에서는 DEBUG까지 출력해도 상관 없지만 운영 서버에서 DEBUG를 출력하면 너무 방대한 양의 로그가 출력되기 때문에 운영 서버에서는 INFO레벨로 출력해주는 것이 좋다.
로그 레벨 설정
application.properties에서 설정 해준다.
#전체 로그 레벨 설정(기본 info) logging.level.root=info |
#hello.springmvc 패키지와 그 하위 로그 레벨 설정 logging.level.hello.springmvc=debug |
로그 사용시 주의할점
- log.debug("data="+data) :로그 출력 레벨을 INFO로 설정해도 해당 코드에 있는 더하기 연산이 실제로 실행되어 출력은 되지 않지만 더하기 연산으로 인해 값은 저장되므로 메모리를 사용하고,CPU를 소모한다.
- log.debug("data={}", data) :로그 출력 레벨을 info로 설정하면 아무일도 발생하지 않는다. 따라서 앞과 같은 의미없는 연산이 발생하지 않는다.
로그 사용시 장점
- 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
- 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
- 시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다. 특히 파일로 남길 때는 일별,
- 특정 용량에 따라 로그를 분할하는 것도 가능하다.
- 성능도 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등등)
마무리
로그를 여기서 모두 설명하기엔 양이 너무 방대 하기 때문에 혹시 더 자세한 내용이 궁금하다면 직접 검색해보면서 공부하는것이 조금 더 효율 적이라고 생각한다.
SLF4J - http://www.slf4j.org
Logback - http://logback.qos.ch
'Dev > Spring' 카테고리의 다른 글
@RequestMapping에 대하여 (0) | 2021.07.24 |
---|---|
[Spring]@RestController 와 @Controller의 차이 (0) | 2021.07.18 |
[Spring]다양한 의존관계 주입 방법 (0) | 2021.06.25 |
[Spring]의존성 주입(Dependency Injection) (0) | 2021.06.24 |
[Spring]@RequiredArgsConstructor (0) | 2021.06.23 |