스프링 프로파일을 설정하는 겸 로깅설정도 해주었다.
윗부분에 이것저것 설정해 봤지만 결국 안돼서 굉장히 간단한 코드로 바뀌었고 맨아래쪽에 최종코드를 첨부했다.
가장 오래된 프레임워크 (2015년 이후 개발이 중단됨)
log4j이후에 출시되어 가장 많이 사용되고 있다.
spring boot starterweb안에 log back이 기본적으로 포함되어 있다.
가장 최근에 나온 로깅 프레임워크
Multi Thread환경에서 비동기 로거는 다른 프레임워크에 비해 처리량이 많고 대기시간이 짧다
얼마전에 보안이슈 있었음
2.16이후로 패치된 것으로 보임
springboot-seb-starter에 기본적으로 logback이 설정되어있음
resources폴더에 logback-spring.xml 파일 생성
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 콘솔(STDOUT)에 log 기록 -->
<!-- appender : 로그를 어디에 출력할지 콘솔,파일,DB 등 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %-5level ${PID:-} --- [%15.15thread] %-40.40logger{36} : %msg%n</Pattern>
</layout>
</appender>
<!-- log root 레벨 설정 (logging.level.root=info)-->
<root level="debug">
<!-- 참조할 appender 설정 - STDOUT -->
<appender-ref ref="STDOUT" />
</root>
</configuration>
-5level : 로그레벨 5글자 고정폭
%thread : 현재 스레드명
%logger{36} 최대 36자리로 logger
%clr : 색설정
FileAppender를 사용하여 로그파일을 rollover( 로그가 쌓인것을 버리거나 옮기고 덮어씌우는것)한다
<!-- yml파일로 설정하여 springProfile로 환경별로 다르게 로그 찍을 수 있음 -->
<springProfile name="real">
<property resource="application-real-log.yml" />
</springProfile>
<!-- log 변수 값 설정 -->
<springProperty name="LOG_PATH" source= "log.config.path" />
<springProperty name="LOG_FILE_NAME" source= "log.config.filename" />
<springProperty name="LOG_MAX_HISTORY" source= "log.config.maxHistory" />
<springProperty name="LOG_TOTAL_SIZE_CAP" source= "log.config.totalSizeCap" />
springProfile로 해당yml파일에 설정된 정보 사용할 수 있음
현재 개발서버가 따로 있지 않기 떄문에 real이라는 배포용만 구분해 두었음
log:
config:
path: ./logs
filename: app-dev
maxHistory: 7 # 7일
totalSizeCap: 10MB # 로그 파일 사이즈
이렇게 하면 될 줄 알았으나 값들을 xml설정파일에서 하나도 가져오지 못한다.
property로 속성을 가져오는게 다 안돼서 방법을 바꿨다.
따로 분리해둔 설정파일을 다 삭제한 후 공통 설정파일에 프로파일별 로깅설정을 추가했다.
---
spring:
config:
activate:
on-profile: "localLog"
logging:
file:
path: ./logs
name: app-local
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 7
---
spring:
config:
activate:
on-profile: "prodLog"
logging:
file:
path: ./logs
name: app-prod
logback:
rollingpolicy:
max-file-size: 3GB
max-history: 60
스프링 문서에 있는 값에 따라 xml에서 설정값을 불러왔다.
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- log 기록할 파일 위치 설정 -->
<file>${LOG_PATH}/${LOG_FILE}.log</file>
<!-- log 기록 타입 인코딩 -->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY}</maxHistory>
<totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
</appender>
---
spring:
config:
activate:
on-profile: "localLog"
logging:
file:
path: ./logs
name: app-local
logback:
rollingpolicy:
max-history: 7
total-size-cap: 10MB
---
spring:
config:
activate:
on-profile: "prodLog"
logging:
file:
path: ./logs
name: app-prod
logback:
rollingpolicy:
max-history: 60
total-size-cap: 3GB
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 로그 패턴에 색상 적용 %clr(pattern){color} -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<property name="CONSOLE_LOG_PATTERN"
value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %clr(%-5level) %clr(${PID:-}){magenta} %clr(---){faint}
%clr([%15.15thread]){faint} %clr(%-40.40logger{36}){cyan} %clr(:){faint} %msg%n"/>
<property name="FILE_LOG_PATTERN"
value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %-5level ${PID:-} --- [%15.15thread] %-40.40logger{36} : %msg%n"/>
<!-- 콘솔(STDOUT) -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
</layout>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- log 기록할 파일 위치 설정 -->
<file>${LOG_PATH}/${LOG_FILE}.log</file>
<!-- log 기록 타입 인코딩 -->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY}</maxHistory>
<totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
</appender>
<!-- spring profile별 로그 설정 -->
<!-- local 환경 -->
<springProfile name="local">
<root level="debug">
<!-- 참조할 appender - STDOUT -->
<appender-ref ref="STDOUT" />
</root>
</springProfile>
<!-- prod 환경 -->
<springProfile name="prod">
<root level="debug">
<!-- 참조할 appender - STDOUT -->
<appender-ref ref="STDOUT" />
</root>
<logger name="org.springframework.web" level="debug">
<!-- 참조할 appender - FILE -->
<appender-ref ref="FILE" />
</logger>
</springProfile>
</configuration>
결국은 블로그고 뭐고 해도 그냥 공식문서에서 시키는 대로 하는게 최고다 왜 저런 오류가 일어나는지 나는 왜 안돼는지는 며칠동안 찾지 못했지만,,,
왜 logback-spring.xml이라고 이름을 붙였을까?
→springboot실행 이후에 logback-spring파일을 읽어드림으로써 spring profile이나 application.yml내용을 logback에사 사용할 수 있게 되었기 때문
출처
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.logging