로깅(Logging)

ryudjae
|2021. 7. 13. 13:41
728x90

 

 

➡️ 로깅(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

 

728x90