springboot logging설정

2024. 2. 29. 18:23OpenSource/Spring Boot

반응형

 

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레벨은 파일에!

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 보안 취약성 발생!

참조 : https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging.logback-extensions

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

반응형