728x90
반응형
항상 개발을 하면서 로그를 잘 볼 수 있어야 한다.
서버를 킨 후 시스템의 상태와 동작 정보를 시간 경과에 따라 기록함으로써 개발 과정에서 발생한 문제를 확인할 수 있고 다양한 정보를 수집할 수 있다.
1. Logback
- Java에서 가장 많이 사용하던 로깅 라이브러리인 log4j의 후속 버전
- SLF4j의 구현체로 Spring Boot라면 별도의 dependency 추가 없이 기본적으로 포함되어 있다.
- Logback은 Log4j에 비해 향상된 필터링 정책, 기능, 로그 레벨 변경 등에 대해 서버를 재시작할 필요 없이 자동 리로딩을 지원하고 성능이 전반적으로 뛰어나다.
2. Log Level
- 총 5가지의 log level
- ERROR - WARN - INFO - DEBUG - TRACE 순으로 심각도가 높아진다.
- ERROR
- 요청을 처리하는 도중 예상하지 못한 문제(오류)가 발생한 경우 표시
- WARN
- 로직 상 유효성 확인, 예상 가능한 문제로 인한 예외 처리
- 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지 표시
- INFO
- 운영에 참고할만한 사항
- 상태 변경과 같은 정보성 로그 표시
- DEBUG
- SQL 로깅 가능 (개발 단계에서 사용)
- 프로그램을 디버깅하기 위한 정보 표시
- TRACE
- 모든 레벨에 대한 로깅 추적 (개발 단계에서 사용)
예를 들어 INFO 레벨로 설정하면 DEBUG, TRACE 레벨은 출력하지 않는다.
3. Logback 패턴
- %logger{length}
- Logger name 축약 가능
- {length}는 최대 글자 수
- ex) logger{35}
- %-5level
- 로그 레벨
- -5는 출력의 고정폭 값(5글자)
- %msg
- 로그 메세지(=%message)
- ${PID:-}
- 프로세스 아이디
- %d
- 로그 기록시간
- %p
- 로깅 레벨
- %F
- 로깅이 발생한 프로그램 파일명
- %M
- 로깅일 발생한 메소드의 명
- %I
- 로깅이 발생한 호출지의 정보
- %L
- 로깅이 발생한 호출지의 라인 수
- %thread
- 현재 Thread 명
- %t
- 로깅이 발생한 Threrad명
- %c
- 로깅이 발생한 카테고리
- %C
- 로깅이 발생한 클래스 명
- %m
- 로그 메세지
- %n
- 줄바꿈
- %%
- %를 출력
- %r
- 애플리케이션 시작 이후 부터 로깅이 발생한 시점 까지의 시간(ms)
4. Logback 설정
- Logback을 따로 설정하지 않으면 default는 INFO 레벨로 설정
- src/main/resources/logback-spring.xml에 설정
- 로그 패턴, 색상, 저장 여부(콘솔, 파일) 등 설정 가능
- 파일 크기에 따라 파일 분할 가능
- 파일 저장 기간에 따라 파일 삭제 가능
- profile에 따라 Logback 설정 가능
- 어느 레벨까지 찍을지와 파일 저장 여부 설정
- local 환경에서는 파일 필요 없으니까 콘솔에만 출력
- dev | stg | prod 환경에서는 콘솔은 안보니까 파일에만 출력
- prod 환경에서 INFO 레벨까지 찍으면 사용자가 많은 경우 로그 용량이 너무 커지니까 ERROR까지만 출력
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 로그 패턴, 색상 설정 -->
<conversionRule conversionWord="applicationName" converterClass="org.springframework.boot.logging.logback.ApplicationNameConverter" />
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="correlationId" converterClass="org.springframework.boot.logging.logback.CorrelationIdConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr(%applicationName[%15.15t]){faint} %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
<property name="CONSOLE_LOG_THRESHOLD" value="${CONSOLE_LOG_THRESHOLD:-TRACE}"/>
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- %applicationName[%t] ${LOG_CORRELATION_PATTERN:-}%-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_CHARSET" value="${FILE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
<property name="FILE_LOG_THRESHOLD" value="${FILE_LOG_THRESHOLD:-TRACE}"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--로그를 콘솔에 출력하기 위한 Appender -->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 로그를 여러 파일에 나눠서 저장하기 위한 Appender -->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 로그 파일 정책 -->
<fileNamePattern>./log/%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!--파일명 -->
<maxFileSize>30MB</maxFileSize> <!-- 해당 용량을 초과했을 시 다음 파일에 작성-->
<maxHistory>30</maxHistory> <!-- 30일이 지나면 삭제 -->
</rollingPolicy>
</appender>
<springProfile name="local"> <!-- local 환경일 경우 콘솔에서만 로그 출력 -->
<logger name="com.example.paymentsystem" level="DEBUG" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
<springProfile name="dev|stg"> <!-- dev, stg 환경일 경우 INFO 레벨의 로그를 파일로 저장 -->
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="prod"> <!-- prod 환경일 경우 ERROR 레벨의 로그를 파일로 저장 -->
<root level="ERROR">
<appender-ref ref="FILE" />
</root>
</springProfile>
</configuration>
728x90
반응형
'Web > Backend' 카테고리의 다른 글
[Backend] Multi Profile 설정 (0) | 2024.09.11 |
---|---|
[Backend] Swagger 설정 (1) | 2024.09.11 |
[Spring] @Controller와 @RestController (0) | 2024.01.05 |
[SpringBoot] sts4 프로젝트 생성 (0) | 2024.01.04 |