springboot logging설정
springboot는 기본적으로 commons-logging을 사용합니다. (https://commons.apache.org/proper/commons-logging/)
하지만 아파치 공통 로그를 사용하되 실질적으로 logging을 logback으로 하고 있다고 합니다ㅋㅋ
LOGBACK을 사용을 하려면 2가지 방법이 있습니다.
첫번째는 application.yml을 통해서 관리를 하는 방법입니다.
두번째는 logback-spring.xml을 만들어서 디테일하게 관리하는 방법입니다.
첫번째 방식
기본이 console로그 입니다.
아래는 application.yml의 설정 입니다.
logging의 레벨도 정할 수 있으며
spring.output.ansi.enabled를 통해 색깔도 이쁘게 할수 있습니다.
또한 파일로 저장을 하고 싶으면
file.path와 file.name으로 만들 수 있습니다.
아래처럼 path와 name 두개를 동시에 사용하면 name이 우선순위가 높습니다. path는 무시~
logging:
level:
root: info
file:
path: ./logs
name: ./logs/acet.log
spring:
output:
ansi:
enabled: always
name을 삭제하고 path ./logs를 설정하면 아래와 같이 default로 spring.log 로 만들어집니다.
이처럼 여러가지 설정들이 존재합니다.
제 소견으로는 springboot를 사용하거나 디테일하게 로그포맷을 관리하지 않아도 된다면
굳이 두번째 방식을 사용하지 않아도 될것 같습니다.
두번째 방식
디테일하게 내가 원하는 포맷과 내가 원하는 색깔 등 나만의 로그를 만들겠다 하시는 분들이 사용하면 되는 방식입니다.
현재 spingboot의 디폴트가 logback이지만 위와 같은 설정들을 하기 위해서는 아래와 같은 셋팅이 필요합니다.
--- 셋팅 ----
logback을 사용하려면 필요한 dependency는 아래와 같습니다.
web을 스프링부트로 개발하는거면 이미 셋팅이 되어있을 겁니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
그리고 resources디렉토리 아래에 logback-spring.xml을 하나 만들어줍니다.
logback.xml보다 logback-spring.xml으로 만드는걸 추천한다고 하네요!
아래그림 참고!
첫번째 기본적인 로깅하는 방법
logback-spring.xml의 기본적인 내용은
<?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" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
<logger name="org.springframework.web" level="DEBUG"/>
</configuration>
File-only output은 아래와 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<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/file-appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
application.yml
logging:
file:
name: "acet.log"
아래와 같이 act.log 파일이 생성됩니다.
열어보면 아래와 같이 로그가 들어가있습니다 ㅎㅎ
여기까지가 기본적인 로깅 입니다.
두번째로 profiles에 따라서 로깅하는 방법 입니다.
그리고 2024.03.03 - [OpenSource/Spring Boot] - springboot profiles
profiles설정을 하셨다면 아래와 같이 profile에 따라서 원하는 appender와 레벨을 사용할 수 있습니다.
<conversionRule은 로깅을 칼라풀하게 만들어 줍니다.
<springProfile은 name에 따라 원하는 application-{profile}.yml을 선택하게 해줍니다.
<property는 패턴을 지정할 수 있습니다.
<appender는 콘솔어펜더, 파일어펜더 등 로깅스타일 입니다.
마지막으로 <springProfile에 따라 level을 정해줍니다.
level은 레벨별로 범위가 있으니 모르시는 분들은 범위에 대해서 알아두셔야 합니다~
trace > debug > info > warn > error > fatal
예를 들어서 info레벨이면 로그에 trace, debug 레벨의 로그는 나오지 않습니다.
그래서 보통 prod에 로그양을 줄이기 위해서 설정을 합니다.
debug는 debug, info, warn, error, fatal 등 다 나옵니다:)
아래에서 pattern value를 보면
참고 : https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging.console-output.color-coded
1번 [2024-03-08 00:46:53:269] // timestamp
2번 INFO // log level
3번 25856 // PID
4번 ---
5번 [ restartedMain] // 쓰레드
6번 .ApplicationArchitectureGuideApplication // 로거이름
: No active profile set, falling back to 1 default profile: "prod" // 메시지
value="
1번 [%d{yyyy-MM-dd HH:mm:ss}:%-3relative]
2번 %clr(%-5level)
3번 %clr(${PID:-}){magenta}
4번 %clr(---){faint}
5번 %clr([%30.16thread]){faint} // 로그 메시지를 생성한 쓰레드 이름을 흐릿한 생삭으로 표시, 최대16글자
6번 %clr(%-40.40logger{36}){cyan} // 로그 메시지를 생성한 로거 이름을 청록색으로 표시
7번 %clr(:){faint} %msg%n"/>
쓰레드명 왼쪽 공백을 삭제 하려면 %30에서 %10정도로 주면 사라집니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<springProfile name="dev">
<property resource="application-dev.yml" />
</springProfile>
<springProfile name="prod">
<property resource="application-prod.yml" />
</springProfile>
<property name="LOGS_FILE_PATH" value="./logs" />
<property name="CONSOLE_LOG_PATTERN"
value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %clr(%-5level) %clr(${PID:-}){magenta} %clr(---){faint} %clr([%10.16thread]){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:-} --- [%10.16thread] %-40.40logger{36} : %msg%n"/>
<!-- console Log -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
</layout>
</appender>
<!-- FILE log -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS_FILE_PATH}/log.log</file>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- spring profile별 로그 설정 -->
<!-- local 환경 -->
<springProfile name="local">
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</springProfile>
<!-- dev 환경 -->
<springProfile name="dev">
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
<logger name="org.springframework.web" level="debug">
<appender-ref ref="FILE" />
</logger>
</springProfile>
<!-- real 환경 -->
<springProfile name="prod">
<root level="info">
<appender-ref ref="STDOUT" />
</root>
<logger name="org.springframework.web" level="debug">
<appender-ref ref="FILE" />
</logger>
</springProfile>
</configuration>
TEST를 해보면 prod의 경우는 info레벨은 콘솔에! debug레벨은 파일에!
log.log에 가서 보면 아래와 같이 DEBUG 로그만 들어가있음을 알수 있습니다.
로깅 관련해서 지금 하는게 좀 더 진행사항이 있으면 업데이트 하도록 하겠습니다 ㅎㅎ
예를들면..아래와 같은 fluentd같은 것 입니다 ㅎㅎ
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging.logback-extensions.profile-specific
즐프하세요!
참고 : (옛날 로그관련 버그가 있었는데 logback이 안정성이 높았던걸로 기억이 나는군요)
2021.12.14 - [OpenSource/log4j&slf4j] - log4j2 보안 취약성 발생!
2016.03.24 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - logging)
https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.logging