Logging
Logging(로깅)이란 애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간순으로 기록하는 것을 의미합니다.
로깅은 개발 영역 중 '비기능 요구사항'에 속합니다. 즉 필수적인 기능은 아니나, 로깅은 디버깅하거나 갭라 이후 발생한 문제를 해결할 때 원인을 분석하는 데 유용합니다.
자바 진영에서 가장 많이 사용되는 Logging 프레임워크는 Logback입니다.
Logback
Logback은 *log4j 이후에 출시된 로깅 프레임워크로서 *slf4j를 기반으로 구현됐으며, 과거에 사용되던 Log4j에 비해 월등한 성능을 자랑합니다.
*log4j: Apache log4j는 Java 기반의 로깅 유틸리티로서, 로그를 파일, 콘솔, HTML, 데이터베이스 등 다양한 대상에 출력할 수 있습니다.
*slf4j (Simple Logging Facade for Java): slf4j는 여러 로깅 프레임워크(log4j, java.util.logging, Logback 등) 사이의 추상화 된 퍼사드(facade) 또는 래퍼(wrapper)를 제공합니다. 이를 통해 개발자는 로깅 프레임워크를 쉽게 교체할 수 있습니다.
Logback의 특징은 다음과 같습니다.
- 크게 5개의 로그 레벨(TRACE, DEBUG, INFO, WARN, ERROR)를 설정할 수 있습니다.
- 실제 운영 환경과 개발 환경에서 각각 다른 출력 레벨을 설정해서 로그를 확인할 수 있습니다.
- Logback의 설정 파일을 일정 시간마다 스캔해서 애플리케이션을 재가동하지 않아도 설정을 변경할 수 있습니다.
- 별도의 프로그램 지원 없이도 자체적으로 로그 파일을 압축할 수 있습니다.
- 저장된 로그 파일에 대한 보관 기간 등을 설정해서 관리할 수 있습니다.
Logback의 로그 레벨
- ERROR: 로직 수행 중에 시스템에 심각한 문제가 발생해서 애플리케이션의 작동이 불가능한 경우를 의미합니다.
- WARN: 시스템 에러의 원인이 될 수 있는 경고 레벨을 의미합니다.
- INFO: 애플리케이션의 상태 변경과 같은 정보 전달을 위해 사용됩니다.
- DEBUG: 애플리케이션의 디버깅을 위한 메시지를 표시하는 레벨을 의미합니다.
- TRACE: DEBUG 레벨보다 더 상세한 메시지를 표현하기 위한 레벨을 의미합니다.
Logback의 영역
Logback은 Property, Appender, Encoder, Pattern, Root 요소로 나뉩니다.
Property
- Logback 설정에서 사용할 수 있는 속석을 정의하는 영역입니다.
- 여기서 정의된 속성은 설정 파일내에서 재사용될 수 있습니다.
Appender
Appender 영역은 로그의 형태를 설정하고 어떤 방법으로 출력할지를 설정하는 곳입니다.
Appender 자체는 하나의 인터페이스를 의미하며, 하위에 여러 구현체가 존재합니다.
Logback의 설정 파일을 이용하면 각 구현체를 등록해서 로그를 원하는 형식으로 출력할 수 있습니다.
Appender의 대표적인 구현체는 다음과 같습니다.
- ConsoleAppender: 콘솔에 로그를 출력
- FileAppender: 파일에 로그를 저장
- RollingFileAppender: 여러 개의 파일을 순회하면서 로그를 저장
- SMTPAppender: 메일로 로그를 전송
- DBAppender: 데이터베이스에 로그를 저장
Encoder
- 로그를 사람이 읽기에 친숙한 포맷으로 변환합니다.(e.g., text, JSON)
- Appender 내에서 로그 이벤트를 어떻게 변환할지 정의합니다.
Pattern
- 로그 메시지의 출력 형식을 지정합니다.
- Pattern은 Encoder 내에서 지정됩니다.
%date
,%level
,%logger
,%msg
과 같은 패턴을 사용하여 출력할 수 있습니다.
Root
- Logger 레벨의 최상층을 나타냅니다.
- Root 영역에서 Appender를 참조해서 로깅 레벨을 설정합니다.
Logback 사용 예시
logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyExample {
private static final Logger logger = LoggerFactory.getLogger(MyExample.class);
public static void main(String[] args) {
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warning message");
logger.error("This is an error message");
}
}
2024-02-22 23:50:49.999 [main] INFO com.example.MyExample - This is an info message
2024-02-22 23:50:49.999 [main] WARN com.example.MyExample - This is a warning message
2024-02-22 23:50:49.999 [main] ERROR com.example.MyExample - This is an error message
스프링 부트에서 사용하기
스프링 부트의 spring-boot-starter-web 라이브러리에는 이미 Logback 프레임워크가 내장되어 있습니다.
또한 스프링 부트는 다음의 이름으로 resource 패키지 안에서 Logback 설정 파일을 찾습니다.
- logback-spring.xml
- logback.xml
- logback-spring.groovy
- logback.groovy
참고 자료
- 스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022
- https://www.baeldung.com/spring-boot-logging
'ComputerScience > Java' 카테고리의 다른 글
[Java] Java에서 예외 처리 (1) | 2024.03.08 |
---|---|
[Java] Compile Time과 Runtime의 차이 (1) | 2024.03.08 |
[Java] immutable(불변) 객체란? (0) | 2024.02.22 |
[Java] JUnit5 (0) | 2024.02.22 |
[Java] Java에서 Queue와 구현체들 (+ ArrayList와 LinkedList의 차이) (0) | 2024.01.31 |