코딩 기록들
게시판만들기 _ Logging 본문
Spring Web Application의 실행기록을 작성하는 방법
-> Slf4j 인터페이스 기반의 오픈소스 라이브러리 사용.
- Log4j
- Logback
- Exception 추적.
- 부정사용 적발 및 추적
- 예상하지 못한 사용자 입력
- 불과 몇 년 전 까지만 해도 Log4J 를 사용 -> 안전취약점이 발견됨에 따라 Logback 으로 전환하는 사례가 많아짐
- Spring Boot에서 Logback 라이브러리가 기본 포함되어 있음 -> 별도의 라이브러리 추가는 필요 없음
Logback 라이브러리 설정방법
https://logback.qos.ch/manual/
* 4번(Appenders) 참고) 실무에서는 전부 RollingFileAppender 씀 (https://logback.qos.ch/manual/appenders.html)
-> log text를 파일에 쓸 수 있음
- rolling policy : 로그파일을 시간별로 자르는 것
- history : 얼마 기간 동안 보관할 것인지
- totalsizecap : 총 로그 양의 제한 용량 -> 이 제한을 넘어가면 지워가며 로그를 남기는 것
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- logback 파일이 수정되어도 재기동하지 않음. 30초마다 체크함 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>Z:/logs/hellospring.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>Z:/logs/hellospring.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} -%kvp- %msg%n</pattern>
</encoder>
</appender>
<!-- 범위(level) : Trace > Debug > Info > Warn > Error -->
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
* 만약, 운영중인 사이트에서 예외발생 시작
-> logback level을 debug로 변경
-> Spring boot : 내부적으로 가지고있는 class, xml(logback), yml 파일의 변경을 감지하는 순간
-> 재기동 함(서버를 내렸다가 올림)
-> 주문중인 사람들이 로그인이 풀려버림
-> 따라서, logback파일을 변경해도 재기동 하지 말라는 설정을 해줘야됨 = configuration = ture 로 설정하면 : logback 파일이 바뀌어도 재기동하지 않음
Logback의 Log Pattern
- (이 패턴대로 로그를 써달라)
Logback은 5개의 Log Level제공
- 개발단계에서의 level = debug로, open단계 = info로 바꿔서 로그를 남긴다
위처럼 로그 설정 이후,
System.out.println() 있는걸 전부 아래와 같이 바꿔주기!!
(system~은 느리고, 자원을 많이 차지하기 때문에 사용 지양)
- controller에서는 전부 -> logger.info() / 그 외에는 -> logger.debug()
에러로그는 다음과 같이 쓴다
- 개발자가 볼 용도 : logger.debug
- 개발자 & 다른사람들 (개발자에게 굳이 필요없는 정보들) : logger.info
- 에러 : logger.error -- printStackTrace -> error로 변경 ex) logger.error(e.getMessage(), e);