HyunsooZo's TIL logo HyunsooZo's TIL

Spring Boot Logging

Logging Library

1. log4j -> log4h2
2. logback

Log Level

Error> Warn > Info > Debug > Trace

Logback Configuration
application.configuration 에 아래 코드추가

logging.config=classpath:logback-spring.xml

이후 resources > 아래의 xml 파일 추가!!

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--변수값 설정 -->
    <property name="LOGS_PATH" value="./logs"/>
    <property name="LOGS_LEVEL" value="INFO"/>

    <!--Console Appender -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--출력 패턴 설정-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</pattern>
        </layout>
    </appender>

    <!--File Appender-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--파일명과 경로 설정-->
        <file>${LOGS_PATH}/log_file.log</file>
        <!--출력 패턴 결정-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!--Rolling 정책-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--.gz,.zip 등을 넣으면 자동 일자별 로그파일 압축-->
            <fileNamePattern>${LOGS_PATH}/%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--파일당 최고용량-->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--일자별 로그파일 최대보관주기(-일), 해당 설정일 이상된 파일은 자동으로 제거-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
    </appender>
    <!--Error Appender-->
    <appender name="Error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--파일명과 경로 설정-->
        <file>${LOGS_PATH}/error_file.log</file>
        <!--출력 패턴 결정-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!--Rolling 정책-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--.gz,.zip등을 넣으면 자동 일자별 로그파일 압축-->
            <fileNamePattern>${LOGS_PATH}/%d{yyyy-MM-dd}_error.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!--threshold filter를 넣어 error 이상의 로그만 걸러지도록-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <root level="${LOGS_LEVEL}">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="Error"/>
    </root>
</configuration>
    //로거 생성
    private static final Logger logger = LoggerFactory.getLogger(WeatherApplication.class);
    
    //info 사용
    logger.info("started to create diary");

git.ignore 에 logs 추가하여 깃헙에는 소스코드만 올리도록..

Spring Exception

Spring의 기본적인 예외처리 (1)

잘못된 경로 진입/호출 시..
Whitelabel Error Page
this application has no explict mapping for/error, so you are seeing this as a fall back....


Spring의 기본적인 예외처리 (2)

데이터 형식 오류 시..
예시: http://localhost:8080/read/diary?date=2022-04-20000
ㅤㅤ(@DateTimeFormat(iso=DateTimeFormat.ISO.DATE)LocalDate Date)
예외: 400 bad request

Spring의 기본적인 예외처리 (3)

사실 Java에서 제공하는 예외처리..
try{

}catch {

}

Spring의 기본적인 예외처리 (4)

Custom Exception 만들기!
public class InvalidDate extends RuntimeException{
ㅤㅤprivate static final String MESSAGE="너무 미래의 날짜입니다.";
ㅤㅤpublic InvalidDate(){
ㅤㅤㅤsuper(MESSAGE);
ㅤㅤ}
}

Custom Exception 예시

package zerobase.weather.error;

public class InvalidDate extends RuntimeException{
    private static final String MESSAGE = "너무과거 혹은 미래의 날짜입니다.";
    public InvalidDate(){
        super(MESSAGE);
    }

    //사용
    if(date.isAfter(LocalDate.ofYearDay(3050,1))){
        throw new InvalidDate();
    }
}

Exception handler

`@Controller`(`@RestController`)의 예외를 하나의 메서드로 처리할 수 있다.
단 한개의 Controller 안에서만 에외처리가 가능하다.

Controller Advice

모든 Controller 단을 대상으로하여 예외처리가 가능하다.
TOP