생각정리/항해99

[실전 프로젝트] 2주차 - 1

생각중임 2023. 10. 13. 00:21

Logback 적용


https://logback.qos.ch/documentation.html

 

Documentation

Logback documentation Below is a list of logback-related documentation currently available. Source code related documentation: Articles and Presentations In french

logback.qos.ch

logback-spring.xml 추가

1. 기본 파일 생성해 configuration 태그를 만들어준다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  
</configuration>

2. 여러 번 사용할 변수들을 선언해준다.

<timestamp key="dailyLog" datePattern="yyyy-MM-dd"/>
<property name="LOG_PATH" value="logs"/>
<property name="LOG_PATTERN"
  value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] [%thread] %-5level %logger{35} - %msg%n"/>

timestamp : 현재시간을 key값을 이용해서 사용할 수 있도록 선언해 사용한다.

property : name과 value를 이용해서 변수로 선언해 사용한다

logback 패턴

  • %d : 로그 기록시간
  • %-3relative : 초아래 단위 시간
  • %thread : 현재 Thread 명
  • %-5level : 로그 레벨 (5글자 까지 출력)
  • %logger{35} : 로그 명 최대 35자리 까지 출력
  • %msg : 로그 메시지
  • %n : 줄 바꿈

3. 개발단계에서 사용할 로그 설정을 프로파일로 나눠 설정을 한다.

<springProfile name="!prod">
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>

    <appender name="SQL-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <file>${LOG_PATH}/sql/sql_${dailyLog}.log</file>
      <encoder>
        <pattern>${LOG_PATTERN}</pattern>
      </encoder>
      <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>${LOG_PATH}/sql/sql_${dailyLog}.%d\(.%i\).log</fileNamePattern>
        <maxFileSize>100MB</maxFileSize>
        <totalSizeCap>3GB</totalSizeCap>
      </rollingPolicy>
    </appender>

    <logger name="org.hibernate">
      <appender-ref ref="SQL-INFO"/>
    </logger>

    <root level="INFO">
      <appender-ref ref="CONSOLE"/>
    </root>
  </springProfile>

springProfile의 이름을 !prod로 해서 prod가 아닐 경우 설정이 되도록 해준다.

include를 이용해서 logback의 기본 콘솔 설정을 가져와서 사용을 한다.

appender로 로그를 파일로 처리하는 설정을 추가한다.

file : 생성 파일명

encoder : 위에 등록한 pattern을 사용한다.

rollingpolicy : 파일 저장 설정

logger : 어떤 로그를 appender에 출력할지 name으로 설정해 준다. (현재는 SQL문을 파일로 만들기 위해 org.hibernate를 사용한다.)

 

4. 운영단계 설정을 프로파일로 나눠 설정을 한다.

<springProfile name="prod">
    <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <file>${LOG_PATH}/info/info_${dailyLog}.log</file>
      <filter class = "ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
      </filter>
      <encoder>
        <pattern>${LOG_PATTERN}</pattern>
      </encoder>
      <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>${LOG_PATH}/info/info_${dailyLog}.%d\(.%i\).log</fileNamePattern>
        <maxFileSize>100MB</maxFileSize>
        <totalSizeCap>3GB</totalSizeCap>
      </rollingPolicy>
    </appender>

    <root level="INFO">
      <appender-ref ref="FILE-INFO"/>
    </root>
  </springProfile>

springProfile명을 prod로 해서 운영단계에 사용하도록 구분을 준다.

기본적인 appender 설정은 파일저장으로 동일하게 사용을 하고 filter를 이용해서 일치하는 레벨의 로그만 저장되도록 설정해준다.

application.yml 프로파일 설정

spring.profiles를 이용해서 프로파일을 나눠서 사용을 하는데 프로파일이 3개 이상으로 그룹을 이용해서 프로파일을 설정해준다.

--- 코드를 이용해서 프로파일을 나눠 작성을 해준다.

spring.config.activate.on-profile : spring-boot 2.4 버전 이후부터 프로파일 설정에 사용되는 코드

spring:
  profiles:
    default: local
    group:
      "local": local, secret
      "prod": prod, secret
---
spring:
  config:
    activate:
      on-profile: local
logging:
  level:
    org:
      hibernate:
        SQL: info
        type:
          descriptor:
            sql: trace
---
spring:
  config:
    activate:
      on-profile: prod
그냥 기본적인 logger를 logback으로 설정을 하는 부분은 홈페이지와 다양한 블로그들을 참고하면서 설정을 할 수 있었는데, 로그를 프로파일로 나 누워서 사용하는 부분과 원래 중요한 설정들을 application-secret.yml으로 나눠 프로파일로 사용을 하면서 include로 추가해서 사용 중에 local과 prod로 프로파일을 나눠 설정을 하면서 해당 프로파일 안에서 include를 이용해서 로그파일설정과 secret을 추가하려고 했는데, 오류를 통해서 확인을 해보니 include로 프로파일을 추가하는 부분과 프로파일을 나눠서 사용하는 설정은 같이 사용을 할 수가 없어 include를 사용을 제외하고 프로파일들을 group으로 사용하고 logback에서 프로파일을 sql-logging 등으로 따로 프로파일로 다루는 게 아니라 local과 prod로 설정한 프로파일명으로 설정하여 해당 프로파일일 경우 작동을 하도록 설정을 해서 해결을 할 수 있었다.