Spring Boot는 모든 내부 로깅을 위한 Commons Logging을 사용하지만, 기본 로그 구현은 열어둔다. Java Util Logging, Log4J2 그리고 Logback에 대한 기본 구성들이 제공된다. 각 로거들은 콘솔 출력와 선택적인 파일 출력을 사용할 수 있도록 사전 구성된다.
기본적으로 "Starts"를 사용한다면, Logback이 로깅을 위해 사용된다. Java Util Logging, Commons Logging, Log4J, or SLF4J를 사용하는 의존 라이브러리들이 모두 제대로 작동하도록 하기 위해 적절한 Logback 라우팅이 포함된다.
Java를 위한 많은 Logging Framework들이 있지만, 일반적으로 로깅 의존 라이브러리들을 바꿀 필요는 없고 Spring Boot 기본값은 잘 작동된다. 애플리케이션을 서블릿 컨테이너(Tomcat)나 애플리케이션 서버에 배포할 때, Java Util Logging API를 통해 수행된 Logging API는 애플리케이션 로그에 라우팅되지 않는다. 따라서 , 컨테이너 또는 컨테이너에 배포된 다른 애플리케이션들에서 수행되는 Logging이 현재 애플리케이션 로그에 나타나지 않는다.
다음은 예제 로그이다.
2019-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
2019-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2019-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
기본 Log 구성은 메시지를 기록할 때 콘솔에 반영한다. 기본값으로 ERROR, WARN, INFO 수준의 메시지들이 기록되며, 애플리케이션을 시작할 때 "--debug" 옵션을 넣거나 application.properties에 debug=true를 지정하여 debug를 활성화할 수 있다.
// shell
java -jar myapp.jar --debug
// application.properties
debug=true
debug 모드를 사용하면, 핵심 로거(내장 컨네이너, Hibernate, Spring Boot)들이 더 많은 정보를 출력하도록 구성된다. debug 모드를 활성화하여도 모든 메시지들을 DEBUG 수준으로 기록하도록 구성되지는 않는다.
또는 애플리케이션을 시작할 때 "--trace" 옵션을 넣거나 application.properties에 trace=true를 지정하여 trace 모드를 활성화할 수 있다.
// shell
java -jar myapp.jar --trace
// application.properties
trace=true
trace 모드를 사용하면, 핵심 로거(내장 컨테이너, Hibernate 스키마 생성, 전체 Spring portfolio)들에 대한 trace 로깅을 할 수 있다.
기본적으로 Spring Boot는 콘솔에만 로그를 기록하고 파일에 로그를 쓰지 않는다. 만약 콘솔 출력뿐만 아니라 파일에 로그를 쓰고 싶다면, logging.file.name이나 loggin.file.path 속성을 설정한다.
logging.file.name | logging.file.path | 예시 | 설명 |
---|---|---|---|
(none) | (none) | 콘솔에만 로깅 | |
파일명 | (none) | my.log | 파일명은 절대경로나 현재 폴더의 상대경로로 설정 |
(none) | 폴더명 | /var/log | 폴더명은 절대경로나 현재 폴더의 상대경로로 설정. (파일명:spring.log) |
로그 파일들은 콘솔 출력처럼 10MB에 도달하면 교대되며 기본적으로 ERROR, WRAN, INFO 수준의 메시지들을 기록한다.
Logback을 사용하면, application.properties 파일에 로그 교대 설정을 바꿀 수 있다. 다른 로깅 시스템에서는 직접 교대 설정을 구성해야만한다. (Log4J2는 log4j.xml 파일을 추가해야한다.)
속성 | 설명 |
---|---|
logging.logback.rollingpolicy.file-name-pattern | 파일명 패턴 |
logging.logback.rollingpolicy.clean-history-on-start | 애플리케이션 시작시 파일 이력 초기화 여부 |
logging.logback.rollingpolicy.max-file-size | 로그 파일 최대 크기 |
logging.logback.rollingpolicy.total-size-cap | 삭제되기 전 로그 파일의 총 개수 |
logging.logback.rollingpolicy.max-history | 로그 파일을 유지할 일수 (기본 7일) |
모든 지원되는 로깅 시스템들은 로그 수준을 Spring Environment에 설정할 수 있다. 로그 수준은 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF 중 하나를 설정하며 root logger는 logging.level.root를 사용하여 구성할 수 있다.
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
관련된 로거들을 그룹화하여 모두 같은 시점에 구성되도록 하면 유용하다.
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.elvel.tomcat=trace
Spring Boot는 다음의 사전 정의된 로깅 그룹들을 포함한다.
그룹 | loggers |
---|---|
web | org.springframework.core.codec |
org.springframework.http | |
org.springframework.web | |
org.springframework.boot.actuate.endpoint.web | |
org.springframework.boot.web.servlet.ServletContextInitializerBeans | |
sql | org.springframework.jdbc.core |
org.hibernate.SQL | |
org.jooq.tools.LoggerListener |
애플리케이션 종료시 로깅 자원들을 풀어 주기 위해, JVM이 종료될 때 로그 시스템 제거를 유발하는 Shutdown Hook이 제공된다. Shutdown Hook은 애플리케이션이 war 파일로 배포되지 않으면 자동적으로 등록된다.
적절한 라이브러리들을 classpath에 포함하여 여러 로깅 시스템들을 활성화할 수 있다. 그리고 classpath의 root에서나 Spring Environment 속성인 logging.config로 기술된 위치에서 적절한 구성 파일로 로깅 시스템들을 커스텀화 할 수 있다.
// root의 logback 폴더내 logback.xml 파일
logging.config=classpath:logback/logback.xml
로깅 시스템에 따라 다음의 파일들을 불러온다.
Logging System | 커스텀 파일 |
---|---|
Logback | logback-spring.xml, logback.xml |
Log4j2 | log4j2-spring.xml, log4j2.xml |
Java Util Logging | logging.properties |
Logback에 관한 자세한 내용은 아래에서 확인하자!
https://velog.io/@pymin1012/Logback