로오오오오기이이이잉 (로깅!)
친애하는 백성들이여. 오랜만이다. 과인이 셤기간과 프로젝트들이 겹쳐서 오랜만에 글을 쓰게 되었다. 역시 학기 중에는 바빠.. 요번에 스마트 미러를 활용한 프로젝트를 맡게 되었고 중간 과정을 블로그에 정리 해 놓긴 했는데 국가 보안 상 일단은 비공개로 해 놓았다. 완성 되면 한번에 풀겠다.
아무쪼록 오늘은 운영시스템에서는 System.out.print();가 아닌 로그를 사용할 것이기에 로그에 대해 알아보자!
0. baisc
롬복에 있는 어노테이션 @Slf4j 를 클래스 레벨에 붙이거나,
아래 두 코드와 같이 이런 방식을 통해 log를 선언한다.
private Logger log = LoggerFactory.getLogger(getClass()); //내 클래스
private static final Logger log = LoggerFactory.getLogger(Xxx.class());
여담으로 Logger 라던지 LoggerFactory를 입력하면 인텔리 제이가 여러 라이브러리에서 오는 동명 클래스들을 보여줄 텐데 org.slf4j로 선택해야만 한다.
1. print() vs log
당연하게도 log가 훠어얼씬 빠르다. 게다가 더 많은 정보를 보여주는데 아래와 같은 코드가 있고 실행을 했다고 하자.
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());// LoggerFactory.getLogger(LogTestController.class);
@RequestMapping("/log-test")
public String logTest(){
String name = "Spring";
System.out.println("name = " + name);
log.trace("trace log={}",name);
return "ok";
}
}
그러면 아래 사진과 같은 콘솔 창이 나온다.
단지 출력한 것 보다 로그를 찍으면 시각이라던지 로그 레벨(DEBUG, 곧 자세히 다루겠다.) 로그 호출한 클래스, 로그 내용 과 같이 자세하게 나온다.
추가로 위에 출력 문 작성할 때 + 연산 대신 {}를 이용한 이유는 + 연산 자체는 메모리와 연산을 까먹기 때문에 만약 로그 레벨에 안맞는 로그 문일 경우 아깝기 때문이다. 즉, 로그를 사용 하기 전에 덧셈 연산 로직이 먼저 수행 된다는 방증이기도 하다.
2. 로그 레벨
LEVEL은 다음과 같다.TRACE > DEBUG > INFO > WARN > ERROR. > 표시는 더 레벨이 높다는 것을 의미한다. 즉, INFO 레벨이 출력되면 WARN 레벨도 출력 되어야만 한다. 이것이 무엇이냐면 application.properties에 보면
logging.level.heloo.springmvc=INFO
의 코드가 있다. 현재 패키지에 대해 info레벨 밑에 모든 로그를 출력한다. 즉 WARN, ERROR 레벨의 로그들을 출력한다는 뜻.
logging.level.root=info
위 코드는 우리가 짠 코드 뿐만 아니라 현재 프로젝트인 모든 라이브러리에 대해 적용한다는 뜻이다.
참고로 개발 서버는 debug 출력운영 서버는 info 출력하게끔 한다.
3. 예시
@Slf4j 어노테이션을 이용하면 로그 선언도 하지 않아도 된다.
@Slf4j
@RestController
public class LogTestController2 {
@RequestMapping("/log-test2")
public String logTest2(){
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";
}
}
log.trace(), log.warn() 과 같이 메소드로 레벨을 구분하고 {}로 파라미터처럼 이용한다는 사실만 알면 된다.
3. 로그 사용시 장점
- 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
- 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
- 시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다. 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.
- 성능도 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등등) 그래서 실무에서는 꼭 로그를 사용해야 한다.