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....
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
예시: http://localhost:8080/read/diary?date=2022-04-20000
ㅤㅤ(@DateTimeFormat(iso=DateTimeFormat.ISO.DATE)LocalDate Date)
예외: 400 bad request
Spring의 기본적인 예외처리 (3)
사실 Java에서 제공하는 예외처리..
try{
}catch {
}
try{
}catch {
}
Spring의 기본적인 예외처리 (4)
Custom Exception 만들기!
public class InvalidDate extends RuntimeException{
ㅤㅤprivate static final String MESSAGE="너무 미래의 날짜입니다.";
ㅤㅤpublic InvalidDate(){
ㅤㅤㅤsuper(MESSAGE);
ㅤㅤ}
}
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 안에서만 에외처리가 가능하다.
Controller Advice
모든 Controller 단을 대상으로하여 예외처리가 가능하다.