Spring Boot에서 Logback 이용해서 logging 설정하는 방법에 대해서 설명한다. 여기서 application.yml
을 이용한 설정방법은 설명 하지 않고, 기본 Logback을 확장해서 logback-spring.xml
을 이용한 방법에대해서 설명한다.
Logback 에 기본 설명은 하지 않는다. 기본설명에 대해서는 Logback 설정 을 참고 하길 바란다.
Maven Dependency spring-boot-starter-web
만 추가해주면 된다.pom.xml 1 2 3 4 <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-web</artifactId > </dependency >
logback-classic
이 종속되어있다.
Spring Boot logback 기본 구조 logback-spring.xml 생성
logback-spring.xml 1 2 3 4 5 <?xml version="1.0" encoding="UTF-8"?> <configuration > <include resource ="org/springframework/boot/logging/logback/base.xml" /> <logger name ="org.springframework.web" level ="DEBUG" /> </configuration >
org/springframework/boot/logging/logback/base.xml 경로를 따라가면 base.xml 에 포함된 코드를 확인해볼수 있다.
Spring Boot 에서 기본 으로 제공하는 logback 설정
base.xml
은 Spring Boot 에서 제공하는 기본 logback 설정 파일
console-appender.xml
은 console에 대한 appender 파일
file-appender.xml
은 file에 대한 appnder 파일
default.xml
은 property, logger 관련 파일
base.xml 1 2 3 4 5 6 7 8 9 10 <included > <include resource =“org/springframework/boot/logging/logback/defaults.xml” /> <property name =“LOG_FILE” value =“${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}” /> <include resource =“org/springframework/boot/logging/logback/console-appender.xml” /> <include resource =“org/springframework/boot/logging/logback/file-appender.xml” /> <root level =“INFO” > <appender-ref ref =“CONSOLE” /> <appender-ref ref =“FILE” /> </root > </included >
console-appender.xml 1 2 3 4 5 6 7 <included > <appender name =“CONSOLE” class =“ch.qos.logback.core.ConsoleAppender” > <encoder > <pattern > ${CONSOLE_LOG_PATTERN}</pattern > </encoder > </appender > </included >
file-appender.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <included > <appender name =“FILE” class =“ch.qos.logback.core.rolling.RollingFileAppender” > <encoder > <pattern > ${FILE_LOG_PATTERN}</pattern > </encoder > <file > ${LOG_FILE}</file > <rollingPolicy class =“ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy” > <fileNamePattern > ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern > <maxFileSize > ${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize > <maxHistory > ${LOG_FILE_MAX_HISTORY:-0}</maxHistory > </rollingPolicy > </appender > </included >
file-default.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <included > <conversionRule conversionWord =“clr” converterClass =“org.springframework.boot.logging.logback.ColorConverter” /> <conversionRule conversionWord =“wex” converterClass =“org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter” /> <conversionRule conversionWord =“wEx” converterClass =“org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter” /> <property name =“CONSOLE_LOG_PATTERN” value =“${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(—){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}” /> <property name =“FILE_LOG_PATTERN” value =“${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } — [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}” /> <logger name =“org.apache.catalina.startup.DigesterFactory” level =“ERROR” /> <logger name =“org.apache.catalina.util.LifecycleBase” level =“ERROR” /> <logger name =“org.apache.coyote.http11.Http11NioProtocol” level =“WARN” /> <logger name =“org.apache.sshd.common.util.SecurityUtils” level =“WARN” /> <logger name =“org.apache.tomcat.util.net.NioSelectorPool” level =“WARN” /> <logger name =“org.eclipse.jetty.util.component.AbstractLifeCycle” level =“ERROR” /> <logger name =“org.hibernate.validator.internal.util.Version” level =“WARN” /> </included >
LogbackApplication.java 생성 후 실행LogbackApplication.java 1 2 3 4 5 6 7 8 9 10 11 12 @SpringBootApplication public class LogbackApplication { private static final Logger logger = LoggerFactory.getLogger(LogbackApplication.class ) ; public static void main (String[] args) { SpringApplication.run(LogbackApplication.class , args ) ; logger.info("Sping boot Logback {}" , LogbackApplication.class .getSimpleName ()) ; } }
결과 화면
Logback 확장 기능 springProfile 소개 springProfile을 이용해서 애플리케이션 배포할 서버마다 로그 단계랑 파일 저장설정에 대해서 설정을 할 수 있다. 이 기능을 하용하려면 logback-spring.xml.을 사용해야된다.
개발, 운영 2가지 상태가 있다고 가정을 하였다.
application-{profile}.yaml 생성
application-dev.yaml 개발 환경 파일
application-prod.yaml 운영 환경 파일
logback-spring.xml 생성 logback-spring.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <?xml version="1.0" encoding="UTF-8"?> <configuration > <include resource ="org/springframework/boot/logging/logback/defaults.xml" /> <include resource ="org/springframework/boot/logging/logback/console-appender.xml" /> <property name ="LOG_FILE" value ="C:/logs/logback/logback.log" /> <property name ="LOG_FILE_PROD" value ="C:/logs/logback/logback-prod.log" /> <springProfile name ="dev" > <appender name ="ROLLING-FILE" class ="ch.qos.logback.core.rolling.RollingFileAppender" > <file > ${LOG_FILE}</file > <encoder class ="ch.qos.logback.classic.encoder.PatternLayoutEncoder" > <pattern > ${FILE_LOG_PATTERN}</pattern > </encoder > <rollingPolicy class ="ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <fileNamePattern > ${LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern > <maxHistory > 10</maxHistory > <totalSizeCap > 10GB</totalSizeCap > </rollingPolicy > </appender > <logger name ="me.logback" level ="debug" additivity ="false" > <appender-ref ref ="CONSOLE" /> <appender-ref ref ="ROLLING-FILE" /> </logger > <root level ="debug" > <appender-ref ref ="CONSOLE" /> <appender-ref ref ="ROLLING-FILE" /> </root > </springProfile > <springProfile name ="prod" > <appender name ="ROLLING-FILE" class ="ch.qos.logback.core.rolling.RollingFileAppender" > <file > ${LOG_FILE_PROD}</file > <encoder class ="ch.qos.logback.classic.encoder.PatternLayoutEncoder" > <pattern > ${FILE_LOG_PATTERN}</pattern > </encoder > <rollingPolicy class ="ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <fileNamePattern > ${LOG_FILE_PROD}.%d{yyyy-MM-dd}-prod</fileNamePattern > <maxHistory > 30</maxHistory > <totalSizeCap > 20GB</totalSizeCap > </rollingPolicy > </appender > <logger name ="me.logback" level ="debug" additivity ="false" > <appender-ref ref ="CONSOLE" /> <appender-ref ref ="ROLLING-FILE" /> </logger > <root level ="info" > <appender-ref ref ="ROLLING-FILE" /> </root > </springProfile > </configuration >
실행 환경 설정에 따라 springProfile에 active 할 name을 지정해서 애플리케이션을 실행시키면 각 설정한 환경에 따라 log를 확인 할수있다.
<springProfile name = "dev">
적용된 개발에 VM option 으로 -Dspring.profiles.active=dev
실행
로그 3번째 Activated activeProfiles dev 활성화 확인
<springProfile name = "prod">
적용된 운영에 VM option 으로 -Dspring.profiles.active=prod
실행
로그 3번째 Activated activeProfiles prod 활성화 확인
생성된 파일 확인
실제 로그파일 저장위치를 <property name="LOG_FILE">
과 <property name="LOG_FILE_PROD">
로 설정했는데, 실제 서버 운영에는 각 저장소가 다르기때문에 같은 name으로 해도된다. 로컬에서 파일이름을 다르게 생성하기 위해서 설정한것이다.
소스코드
참조