[스프링부트] 로깅설정하기

귤쳥·2022년 9월 16일
0

별 헤는 밤 고치기

목록 보기
3/3
post-thumbnail

별 헤는 밤 블로그 바로가기

스프링 프로파일을 설정하는 겸 로깅설정도 해주었다.
윗부분에 이것저것 설정해 봤지만 결국 안돼서 굉장히 간단한 코드로 바뀌었고 맨아래쪽에 최종코드를 첨부했다.

Logging 프레임워크

slf4j

  • 자체적인 로깅 프레임워크가 아니다. logger추상체로써 다른 로깅 프레임워크를 바꾸면서 쓸 수 있게 해주는 프레임워크 → 코드를 바꾸지 않고 다른 로깅 프레임워크를 사용할 수 있다.

log4j

가장 오래된 프레임워크 (2015년 이후 개발이 중단됨)

logback

log4j이후에 출시되어 가장 많이 사용되고 있다.

spring boot starterweb안에 log back이 기본적으로 포함되어 있다.

log4j2

가장 최근에 나온 로깅 프레임워크

Multi Thread환경에서 비동기 로거는 다른 프레임워크에 비해 처리량이 많고 대기시간이 짧다

얼마전에 보안이슈 있었음

2.16이후로 패치된 것으로 보임

Springboot에서의 로그설정

springboot-seb-starter에 기본적으로 logback이 설정되어있음

xml파일로 로그 설정하기

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 : 색설정

콘솔과 파일에 따로 로그설정하기

RollingFileAppender사용

FileAppender를 사용하여 로그파일을 rollover( 로그가 쌓인것을 버리거나 옮기고 덮어씌우는것)한다

  • Rolling Policy : rollover에 필요한 action설정(시간, 파일크기 등)
<!--  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>

최종 코드

  • application.yml
    ---
    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
  • logback-spring
    <?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

https://logback.qos.ch/manual/appenders.html

https://loosie.tistory.com/829

profile
혼긱 CE의 이제 막 시작하는 코딩

0개의 댓글