SpringBoot

Logging -강의

요는 2022. 3. 22. 10:04

logging을 깊게 파고들진 x, 가장 기본적으로 알아야 될 범위만 알 예정 -> 디버깅 할 때 좋음

logging : 정보 얻기 위해 하는것. 너무 깊게 파고들지 x


1. Logging의 기본 개념들

1. Log 남기기

 : trace,  debug, info, warn, error

- 5가지 Log level을 이용하여 메세지를 남김

- fatal, notice등 추가적인 것들은 어떤 언어를 사용하느냐에 따라 달라짐 js 등..

log남기기란?

: 상용서비스에서 프로그램이 돌아가는 것을 확인 하기 위해, 어떤 시점에 뭐가 나타나는지 log를 남겨서 확인

System.out.println으로 진행과정 중간 확인 하듯 logging 도 마찬가지

id 사용할 때 : debug tool 사용-> 어느시점에 어떤 변수가 어떤 값을 들고 있는지 확인 가능

상용서비스 : 프로그램 돌아가는 것 24시간 지켜볼 수 X 어떤 시점에 뭐가 나타나는지-> log를 남기는 행위

 

logger와 사용이력의 구분

logger : 진행될 때 무슨일이 일어났는지 개발적인 측면에서 남기는 메세지 -> 프로그램의 진행 확인

사용이력 : 서비스 어떻게 사용했는지, db의 이력 남기기

 

logger 사용시 주의할 점

- 영문으로 logger남기기 -> utf 지원하지만 영어는 ascii코드로 작성되어서 많은 system에 호환됨

- 의미 없는 메세지 남기지 말기, 어떤 일이 있었는지에 대해 남길 것.

 

2. Log-level

- 작성하고자 하는 메세지의 중요도, 위험도에 대한 설명

- error로 갈수록 위험한 수준의 진행상황 

trace와 debug가 출력되지 않음

trace : 사소한 메세지, 진행상황 / 상용서비스에서는 제거하는 것이 좋음.
      ex) 변수에 값을 할당했다, 변수를 어디에 넣었다
debug : 행위가 일어났다 수준
info : 일반적인 진행상황
error: 서비스가 정상적으로 진행되지 않음

 

기본값을 debug로 설정

application에 설정된 레벨보다 중요한 메세지만 출력된다. (기본값 : info)

-> 기본값 이하인 trace와 debug는 출력 x

 

<application 전체 기본 로그 전달>

logging : level : root : warn

<실행인자로 직접 전달>

java -jar springboot.jar --trace

java -jar springboot.jar --debug

 

root와 같은 계층에 package명 :info

logger.getname -> class 이름, 클래스명 기반으로 패키지 범위 설정으로 정의 

 

 

 


2. Logback 설정법

log들이 실행중에만 작성이 됨.

 

1. Logback

: springboot에서 기본으로 사용하는 Framework

log file들 관리 + 출력 정의하기 위해 logging library사용함

 

slf4j 패키지에서 logger interface를 제공

LoggerFactory를 통해 받아온 logger ->  Logback이라는 library를 사용.

 

2. Logback 설정법

- Appender : logback이 appender를 통해 어떤 식으로 로그 출력하고 저장할지 설정 할 수 있음

        ConsoleAppender, FileAppender : 어디에 출력할지 설정

- XML을 통해 apppender, log level등 정의 가능

 

3. Appender실습

1) logback-spring.xml 생성

spring에서 요청하는 표준. 이 파일 존재하면 springboot 실행될 때 자동적으로 이 파일읽어서 설정 하게 됨

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

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

    <appender name="Console"
              class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
<!--            <Pattern>-->
<!--                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable-->
<!--            </Pattern>-->
            <Pattern>
                %d{ISO8601} %highlight(%-5level)
            </Pattern>
        </layout>
    </appender>

    <appender name="RollingFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS}/spring-boot-logger.log</file>
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
        </encoder>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd-HH-mm}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <root level="info">
       <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </root>

    <logger name="dev.aquashdw" level="trace" additivity="false">-->
        <appender-ref ref="RollingFile" />-->
       <appender-ref ref="Console" />-->
    </logger>-->

</configuration>

 

2) Console appender

 <appender name="Console"
              class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
<!--            <Pattern>-->
<!--                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable-->
<!--            </Pattern>-->
            <Pattern>
                %d{ISO8601} %highlight(%-5level)
            </Pattern>
        </layout>
    </appender>

- logback library에서 읽어들여 appender instance로 사용.

- console 변수명 적용 

     class : appender 구현체
     layout : PatternLayout -> 패턴을 줘서 메세지가 어떻게 작용이 될 것인지
     pattern :  어떤식으로 출력 될것인지 -> log의 출력에 색 적용

     

project> logs>archived, spring-boot-logger.log 가 생성이 됨

 

3) RollingFile appender

 <appender name="RollingFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS}/spring-boot-logger.log</file>
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
        </encoder>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd-HH-mm}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

rolling file appender : file에 출력

<file>  : file에 대한 정의 ${LOGS}
<encoder> : 어떤 형식으로 출력할지 (=layout과 동일 역할)
<pattern> : 출력 더 간단. file 에선 작성밖에 못해서.
<rollingPolicy> : 일정 규칙 가지고 파일을 생성해서 이전에 작성한 log를 해당 파일로 옮겨 받고 실제 돌아가고 있는 log파일은 지워주는 것 / 어던 규칙을 가지고 log를 돌리고 백업하고 백업내용 지울지 정의함.
<maxFileSize> : 최대 파일 크기 . 넘어가면 %.i인 다음 파일에 만듬
<maxHistory> : 생성돼서 archieved에 들어가는 파일의 내용 몇개
<totalSizeCap> : 모든 log 파일의 최대 크기

 

<root> : 모든 패키지들이 적용될 규칙

<logger> 객체 선언

<appender-ref> : 어떤 appender를 사용할 지, 만들어 놓은 log설정을 가져다가 사용함.

 

위의 내용을 열심히 만들어도 <logger>에서 사용하지 않으면 정상적으로 작동 x

 

4. logback-spring-test.xml

 

resource 안에 작성할 경우 jar파일을 만들 때 같이 포함이 돼서 만들어짐 ->classpath 이용

 

밖에 만들고 싶을 경우 

jar 파일 실행 할 때 -D 옵션을 통해 설정 전달 할 수 있음

java -Dlogging.config=logback-pring-external.xml -jar build\libs\jap-0.0.1-SNAPSHOT.jar

 


마무리

너무 완벽하게 쓰기 보단 사람이 읽을 수 있는 형태의 log 작성하는것에 주력을 다하도록. 

문제 생겼을 대 어디까지 알아야 해결 할 수 있는지가 핵심

 

'SpringBoot' 카테고리의 다른 글

Interceptors & Filters  (0) 2022.03.24
Exception Handling - 강의 정리  (0) 2022.03.24
Validation - 강의정리  (0) 2022.03.22
Spring AOP -강의정리  (0) 2022.03.22
Spring Boot Properties - 강의 정리  (0) 2022.03.22