Logging 이란
로깅이란 정보를 제공하는 일련의 기록인 로그(Log)를 생성하도록 시스템을 작성하는 활동을 의미한다. 보다 쉽게 설명하면 프로그램 동작 시 발생하는 모든 일을 기록하는 행위를 로깅이라고 할 수 있다. 이러한 로깅은 주로 프로그램의 동작 상태를 기록하여 어플리케이션을 운영하는 도중에 문제가 발생했을 때 해당 문제에 대한 원인을 분석하기 위해 사용된다.
자바에서는 System.out.println() 메소드를 사용해 원하는 내용을 출력할 수 있긴 하나 해당 메소드는 콘솔에서만 내용을 출력할 수 있다. 따라서 일반적으로 로깅을 할 때는 log4j나 logback과 같은 로깅 라이브러리를 사용해 로그 파일을 생성하는 방법을 사용한다.
Log Level
일반적으로 로깅 라이브러리를 사용하여 로그를 기록할 때는 로그의 목적에 따라서 레벨을 다르게 설정해야 하는데 각 레벨 별 특징은 다음과 같다.
- TRACE
- 가장 상세한 로그 레벨로 어플리케이션의 실행 흐름과 디버깅 정보를 상세히 기록할 때 사용한다.
- 주로 개발 환경에서 디버깅 목적으로 사용된다. - DEBUG
- 디버깅 목적으로 사용되며 상세한 정보를 기록할 때 사용한다.
- 주로 개발 환경에서 쓰이며 Info 레벨 보다 더 자세한 정보가 필요한 경우에 사용된다. - INFO
- 어플리케이션의 정상적인 작동 정보를 기록할 때 사용한다.
- 어플리케이션의 주요 이벤트나 실행 상태에 대한 정보를 로깅하는데 사용된다. - WARN
- 예상치 못한 문제나 잠재적인 오류 상황을 기록할 때 사용한다.
- 어플리케이션이 정상적으로 동작하지만 주의가 필요한 상황을 알려야 할 때 사용된다. (ex. 사용되지 않는 API가 사용된 경우) - ERROR
- 어플리케이션의 정상적인 동작에 영향을 미칠 수 있는 상황에서 사용된다. (심각한 문제가 발생한 경우)
- 예외 상황이나 시스템 에러, 외부 서비스와의 통신 문제 등을 기록할 때 사용된다. - FATAL
- 가장 심각한 오류 메시지를 기록할 때 사용한다.
- 어플리케이션의 동작을 중단시킬 수 있을 정도로 치명적인 문제가 발생할 때 사용한다.
- 이러한 특징 때문에 FATAL 레벨은 거의 사용되지 않는다.
위와 같은 특징 때문에 일반적으로 각 환경에서 쓰이는 로그 레벨은 다음과 같다.
- 개발환경 : DEBUG, TRACE
- 테스트 / 운영환경 : INFO, WARN, ERROR
SL4J와 Logback
SL4J (Simple Logging Facade For Java)는 로깅 추상화 라이브러리다. 이러한 SL4J는 로깅 시스템과의 결합을 줄이고 로깅 시스템을 유현하게 교체할 수 있는 기능을 제공한다.
보다 쉽게 설명하면 SL4J는 로깅 인터페이스이기 때문에 개발자가 배포시 원하는 구현체를 선택하여 로깅을 구현할 수 있게 만들어 준다.
Logback은 Java에서 가장 많이 사용되었던 로깅 라이브러리인 log4j의 후속버전 라이브러리이며 SL4J와 연동 가능한 특징을 가지고 있다.
SpringBoot에서 Logback 사용 방법
스프링 부트에선 기본적으로 Logback이 설정되어 있다. 다음과 같이 spring-boot-starter-logging 라이브러리에 기본적으로 설치되어 있어서 SLF4J의 3가지 모듈이 Logback과 연결된다.
1. /src/main/resources/ 경로에 logback-spring.xml 파일 생성
2.logback-spring.xml 파일에 아래 코드 적용
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- log 기록 절대 위치 설정 -->
<property name="LOGS_ABSOLUTE_PATH" value="./logs" />
<property name="CONSOLE_LOG_PATTERN"
value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %clr(%-5level) %clr(${PID:-}){magenta} %clr(---){faint} %clr([%15.15thread]){faint} %clr(%-40.40logger{36}){cyan} %clr(:){faint} %msg%n"/>
<property name="FILE_LOG_PATTERN"
value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %-5level ${PID:-} --- [%15.15thread] %-40.40logger{36} : %msg%n"/>
<!-- 콘솔(STDOUT) -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
</layout>
</appender>
<!-- 파일(FILE) -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- log 기록할 파일 위치 설정 -->
<file>${LOGS_ABSOLUTE_PATH}/logback.log</file>
<!-- log 기록 타입 인코딩 -->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- log 레벨 설정 (logging.level.root=info)-->
<root level="info">
<!-- 참조할 appender 설정 -->
<!-- <appender-ref ref="STDOUT" />-->
<appender-ref ref="FILE" />
</root>
<!-- log 레벨 설정 (org.springframework.web=debug)-->
<logger name="org.springframework.web" level="debug">
<appender-ref ref="FILE" />
</logger>
</configuration>
- 위 코드에서는 로그의 root level을 info 로 설정했기 때문에 info 레벨 이상의 로그만 작동한다. (INFO, WARN, ERROR, FATAL 레벨 로그만 기록됨)
- 또한 참조할 appender를 FILE로 설정했기 때문에 로그가 파일로 생성되어 기록된다.
- 파일 롤링 정책은 다음과 같다.
1) logFile.%d{yyyy-MM-dd}.log 이라는 네임 패턴을 가진 로그 파일이 생성되며 매일 새로운 로그 파일이 생성됨
2) maxHistory 가 30으로 설정되어 있어서 30일 보다 오래된 로그 파일은 자동으로 삭제됨
3) totalSizeCap이 3GB로 설정되어 있어서 전체 로그 파일의 크기가 3GB를 못 넘김. 넘어가면 가장 오래된 로그 파일부터 삭제하여 이 조건을 유지함
3. 클래스 파일에서 다음과 같은 방식으로 log 메소드 호출
보다 자세한 방법을 확인하고 싶으면 아래 링크를 방문하는 것을 권장한다.
https://loosie.tistory.com/829
출처 : https://www.youtube.com/watch?v=1MD5xbwznlI&t=650s https://sharonprogress.tistory.com/198 https://livenow14.tistory.com/63 https://loosie.tistory.com/829 |
'Spring' 카테고리의 다른 글
JDK Dynamic Proxy vs CGLIB Proxy (0) | 2024.07.02 |
---|---|
AOP와 Spring AOP (0) | 2024.06.26 |
Filter, Interceptor, AOP (0) | 2023.11.29 |
Spring Framework의 특징과 작동 과정 (1) | 2023.11.18 |
JSP(Java Server Page) (0) | 2023.11.12 |