발생한 행위에 대한 정보를 시간에 따라 남겨둔 데이터
아래는 로그의 예시이다.
2023-08-03T02:33:29.377+09:00 INFO 4471 --- [ restartedMain] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html]
2023-08-03T02:33:29.436+09:00 INFO 4471 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2023-08-03T02:33:29.451+09:00 INFO 4471 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-08-03T02:33:29.456+09:00 INFO 4471 --- [ restartedMain] h.itemservice.ItemServiceApplication : Started ItemServiceApplication in 0.842 seconds (process running for 1.123)
기본적으로 시간, 로그 레벨, 프로세스 ID, 쓰레드 네임, 클래스 네임, 로그 메시지 형식을 갖는다.
로그는 System.out.println()
과 마찬가지로 console에 출력된다.
그렇다면 왜 로그를 사용할까?
로깅 레벨을 통해 정보를 관리하고, 문자열 작업 등으로 인한 성능 저하를 방지한다.
또한 로그 포맷팅, 저장, 환경에 따른 설정이 가능하다.
어떻게 정보 관리와 성능 저하 방지가 가능한지는 아래에서 알아보자.
아래와같이 Logger
클래스 선언을 통해 로그를 선언할 수 있다.
또는 lombok
라이브러리를 통해 @Slf4j
어노테이션만으로 간편하게 로그 선언이 가능해진다.
아래와같이 log.info()
를 통해 로그를 사용할 수 있다.
{}가 두 번째 인자의 문자열로 치환된다.
로그 레벨은 로그의 중요도를 나타낸다. 종류는 다음과같다.
TRACE DEBUG INFO WARN ERROR
예를 들어 로그 레벨을 INFO로 설정하게 되면, INFO 이상의 중요도를 가진 로그만 출력된다. 즉 INFO, WARN, ERROR가 출력된다.
레벨 설정은 application.yml
파일에서 아래와같이 진행한다.
위의 경우 코드만으로 알 수 있겠지만, TRACE 이상의 중요도를 가진 로그만 출력하게 된다.
아래 코드를 호출한 결과를 살펴보자.
2023-08-03T03:13:33.892+09:00 TRACE 4732 --- [nio-8080-exec-1] h.springmvc.basic.LogTestController : trace log = plz enjoy my blog🥰
2023-08-03T03:13:33.892+09:00 DEBUG 4732 --- [nio-8080-exec-1] h.springmvc.basic.LogTestController : debug log = plz enjoy my blog🥰
2023-08-03T03:13:33.892+09:00 WARN 4732 --- [nio-8080-exec-1] h.springmvc.basic.LogTestController : warn log = plz enjoy my blog🥰
2023-08-03T03:13:33.892+09:00 INFO 4732 --- [nio-8080-exec-1] h.springmvc.basic.LogTestController : info log = plz enjoy my blog🥰
2023-08-03T03:13:33.892+09:00 ERROR 4732 --- [nio-8080-exec-1] h.springmvc.basic.LogTestController : error log = plz enjoy my blog🥰
로그 레벨을 INFO
로 설정했을 경우, 아래 두 코드는 어떤 차이를 가질까?
log.debug("data = " + msg);//1번
log.debug("data = {}", msg);//2번
1번 코드의 경우, 문자열 덧셈 연산이 실행이 된다.
그러나 2번 코드의 경우, 의미없는 연산이 발생하지 않아 성능 저하가 방지된다.
앞서 언급한 로그를 사용하는 이유 중 하나이다.
좋은 글 감사합니다. 자주 올게요 :)