Backend/Spring

[Spring] Logging / Logging Framework / Log Level / Logback / Log Appender

mirae.kwak 2022. 7. 31. 13:35
728x90

Logging 이란?

  • 시스템을 작동할 때 시스템의 작동 상태의 기록과 보존, 이용자의 습성 조사 및 시스템 동작의 분석 등을 하기 위해 작동 중의 각종 정보를 기록해두는 것
  • 로그 시스템의 사용에 관계된 일련의 사건을 시간의 경과에 따라 기록하는 것
  • system.out : 불편함, 여러번 로그를 찍으면 오버헤드가 발생할 수 있어 성능저하 발생 -> 사용안함!
 

Logging Framework

  • java.util.logging : 거의 안씀
  • apache commons logging
  • log4j : 성능상 문제 -> log4j2 탄생
  • logback : 제일 많이 사용
  • slf4j : 로깅 프레임워크들을 여러개 사용할 수 있게 해주는 인터페이스

 

SLF4J (Simple Logging Facade For Java)

여러 logging framework를 추상화해놓은 프레임워크

facade pattern을 이용한 로깅 프레임워크

  • facade pattern : 많은 서브시스템을 거대한 클래스로 만들어 감싸서 편리한 인터페이스를 제공하며 pacade만 보고 메소드를 호출하면 실제로 어떤 프레임워크를 써서 작동되는지 모르게 한다.

좋은 로깅 프레임워크가 나올 때마다 매번 코드를 변경하면 좋지 않기 때문에 이를 사용하면 바인딩만 바꿔서 설정만 바꿔서 같은 코드로 사용하게 해줌 

 

즉, 다양한 로깅 프레임워크를 바인딩 모듈을 통해 처리해서 지원!

  • 바인딩 모듈 : 로깅 프레임워크를 연결하는 역할
  • 개발자는 SLF4J를 이용해서 로그를 남기고 실제 프레임워크 연결은 바인딩이 해결

 

Log Level

어떤 상황에 어떤 환경 별로 로그를 어느정도까지 남길지 결정

 

  1. trace
  2. debug
  3. info
  4. warn
  5. error

예를 들어 설정을 warn으로 했다면 warnning보다 더 심각한 수준의 로그 레벨(warn, error)만 로그가 남게됨. 즉 trace, debug, info 레벨의 로그는 나오지 않음

 

만약 시스템의 모든 로그를 보겠다고 하면 trace로 설정

 

로그를 꺼버리고 싶다면 off로 설정(로그를 남기는 것 자체도 시스템 성능에 영향을 미치기 때문)

 

 

Logger

로그를 기록하는 행위

이름 기반으로 생성됨

 

 

Logback 설정

로그에 관련된 설정은 로깅 프레임워크 설정에 따르게 되는데 이때 logback설정을 통해서 로깅 설정이 가능

 

logback 설정 파일 찾는 순서

  1. logback-test.xml 파일을 찾음
  2. 없다면 logback.groovy를 찾음
  3. 없다면 logback.xml을 찾음
  4. 모두 없다면 기본 설정 전략을 따름 BasicConfiguration

logback-test.xml을 제일 먼저 찾는 이유?

- test라는 폴더에 테스트 코드를 작성하는데 자바 폴더의 같은 레벨로 resources라는 폴더가 있는데 이 밑에 logback-test.xml을 넣음

- 테스트에서는 메인의 클래스를 임포트해서 쓸 수 있고 리소스도 쓸 수 있기 때문에 충돌이 날 수 있어 먼저 적용되는 것

- 실제 배포 시에는 logback-test가 없기 때문에 logback.groovy, logback.xml을 사용하게 되는 것

 

<configuration>
    <conversionRule
            conversionWord="clr"
            converterClass="org.springframework.boot.logging.logback.ColorConverter"/>

    <property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"></property>
    
    <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/access.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/access-%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <logger name="org.prgrms.kdt" level="info" additivity="false">
        <appender-ref ref="ROLLING_FILE" />
    </logger>

    <root level="warn">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

 

 

Log Appender

ConsoleAppender, FileAppender, RollingFileAppender 3가지가 존재

 

1. ConsoleAppender

콘솔에 로그를 찍는 것

<property name="CONSOLE_LOG_PATTERN" value="%clr(%d{HH:mm:ss.SSS}){cyan} [%thread] %clr(%-5level) %logger{36} - %msg%n"></property>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${CONSOLE_LOG_PATTERN}</pattern>
    </encoder>
</appender>

 

2. FileAppender

로그를 파일에 저장

기본적으로 로그가 덧붙여서 저장되기 때문에 append false를 통해 새로 작성할 수 있음

만약 로그마다 다른 파일에 저장하고 싶다면?

- TimeStamp를 정의한 뒤 파일을 time마다 저장하도록 함

<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"></property>
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"></timestamp>

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logs/kdt_${bySecond}.log</file>
    <append>false</append>
    <encoder>
    <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
</appender>

 

3. RollingFileAppender

이때 rollingPolicy와 triggerPolicy가 정의되어야 함

  • rollingPolicy : 파일을 어떻게 만들 것인지 정의
  • triggerPolicy: 언제 로깅을 남길 것인지 정의

TimeBasedRollingPolicy를 사용할 경우 두 가지를 한번에 정의

<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"></property>

<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/access.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logs/access-%d{yyyy-MM-dd}.log</fileNamePattern>
    </rollingPolicy>
    <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
</appender>

 

728x90