My-Books-projects / etc

0 stars 1 forks source link

Logback #158

Open hyeonjaez opened 6 months ago

hyeonjaez commented 6 months ago

Spring Logback 설정하기에 앞서서..

우리가 흔히 썼던 방식이였던 logging 방법은 lombok라이브러리의 SLF4J(심플 로딩 파사드 for Java) 를 사용하였다

SLF4J 이름 그대로 로깅 시스템에 대한 추상화를 제공한다

SLF4J는 추상 로깅 프레임워크이기 때문에 단독으로는 사용하지 못함. 즉, 최종 사용자가 배포시 원하는 로깅 프레임워크를 결정하고 사용해도 SLF4J가 인터페이스화 되어있기에, SLF4J를 의존하는 클라이언트 코드에서는 실제 구현을 몰라도 된다 (의존관계 역전 법칙).

그러면 구현체가 있어야한다

구현체로는 Logback, Log4j, java.util.logging 이 있다

우리는 이 세개의 구현체중에 Logback이라는 것을 사용할 것이다


Logback

등등의 다양한 이점으로 인하여 Logback으로 설정을 할 것이다.

로그 레벨은 기본적으로 [trace > debug > info > warn > error] 순이고 디폴트 설정은 info 로 되어 있다.

만약 설정을 info로 한다면 -> info의 하위 단계인 trace와 debug는 기록 되지 않는다

Log level 이란

1) TRACE

2) DEBUG

3) INFO

4) WARN

5) ERROR


xml 파일로 기본적인 로깅 하는 방법

 <configuration> 
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
          <encoder> 
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern> 
          </encoder> 
    </appender> 

    <logger name="com.example.package" level="debug"> 
        <appender-ref ref="CONSOLE"/> 
    </logger>

    <root level="info"> 
        <appender-ref ref="CONSOLE"/> 
    </root> 
</configuration>

Log pattern

종류

<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>

순서대로 시간, 스레드 이름, 로그레벨, 로그의 이름, 실제 로그메시지, 새로운 줄을 표시 등을 나타낸다

로그 파일 저장

<appender name="INFO_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./logs/info.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
        </filter>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <charset>utf8</charset> 
             <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %thread [%X{traceId}] %-5level %logger - %m%n</Pattern> 
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>./was-logs/info.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>100</maxHistory>
            </rollingPolicy>
    </appender>
  1. RollingFileAppender 를 사용할건데 FileAppender를 상속하여 로그 파일을 rollover 한다
  2. file 이라는 걸 이용하여 경로와 이름을 지정한다
  3. filter 로그 이벤트를 필터링하는데 사용되며, 여기서는 [LevelFilter] 를 사용하여 INFO 레벨 이상의 로그만 해당 appender에 기록하도록 설정했다
  4. encoder 인코딩을 어떻게 할지 설정하는 것이다 pattern를 사용하였다
  5. rollingPolicy 로그 파일의 롤링 정책을 설정한다
    • TimeBasedRollingPolicy를 사용하여 시간 기반으로 로그 파일을 롤링하고 있다.
    • 날짜 기준으로 롤링된다

개발 환경별 로그 출력

    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
        </root>
    </springProfile>

    <springProfile name="dev">
        <root level="DEBUG">
            <appender-ref ref="STDOUT"/>
        </root>
        <logger name="org.hibernate.type.descriptor.sql" additivity="false">
            <level value = "TRACE" />
            <appender-ref ref="STDOUT"/>
        </logger>
    </springProfile>

XML 설정

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

    <property name="LOGS_ABSOLUTE_PATH" value="./logs"/>  

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

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %clr(%-5level) %cyan(%logger) - %msg%n</pattern>  
        </encoder>    </appender>  

    <appender name="LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <file>${LOGS_ABSOLUTE_PATH}/resource.log</file>  
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">  
            <charset>utf8</charset>  
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %thread [%X{traceId}] %-5level %logger - %msg%n</Pattern>  
        </encoder>  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <fileNamePattern>${LOGS_ABSOLUTE_PATH}/resource.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>  
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
                <maxFileSize>100MB</maxFileSize>  
            </timeBasedFileNamingAndTriggeringPolicy>            <maxHistory>180</maxHistory>  
        </rollingPolicy>    </appender>  

    <springProfile name="prod">  
        <root level="INFO">  
            <appender-ref ref="STDOUT"/>  
            <appender-ref ref="LOG"/>  
        </root>    </springProfile>  
    <springProfile name="dev">  
        <root level="DEBUG">  
            <appender-ref ref="STDOUT"/>
        </root>  
        <logger name="org.hibernate.type.descriptor.sql" additivity="false">  
            <level value="TRACE"/>  
            <appender-ref ref="STDOUT"/>  
        </logger>    </springProfile>  
    <!--    <logger name="com.nhnacademy.exam.service" level="DEBUG"/>-->  

</configuration>

Properties 설정

Log Levels

logging.level.store.mybooks.resource = debug

Logging pattern

logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %clr(%-5level) %cyan(%logger) - %msg%n

Logging file

logging.file.name=${LOGS_ABSOLUTE_PATH}/resource.log
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %clr(%-5level) %cyan(%logger) - %msg%n
logging.logback.rollingpolicy.max-file-size=100MB
logging.logback.rollingpolicy.max-history=180


- prod
```Properties
# Log Levels  
logging.level.store.mybooks.resource = INFO  

# Logging pattern  
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %clr(%-5level) %cyan(%logger) - %msg%n  

# Logging file  
logging.file.name=${LOGS_ABSOLUTE_PATH}/resource.log  
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %clr(%-5level) %cyan(%logger) - %msg%n  
logging.logback.rollingpolicy.max-file-size=100MB  
logging.logback.rollingpolicy.max-history=180