안녕하세요 jju_developer입니다.
디버깅을 할 때 System.out.println 대신 로그를 사용하는 이유가 무엇일까요?
Java와 Spring Boot에서의 로깅과 관련된 내용을 중점적으로 다뤄보겠습니다!
또한, 로그를 대체할 수 있는 방법까지 알아봅시다.

우선 log를 왜 찍을까요?
초반에 간편히 sout (System.out...) 해서 그냥 프린트로 찍어서 테스트를 했었지만,
서버 운영할 때 다 빌드 해놓고 어디서 오류가 났는지 확인하기 어려운 경우가 있었습니다.
그럴 때 내 소스코드를 까서 볼 수는 없으니까
로그를 기록해서 putty로 접속해서 해당 로그를 다운로드해서 본다면
적어도 어디서 오류가 났는지 혹은 어디까지 코드가 탔는지를 쉽게 볼 수 있겠죠?
이처럼 로그는 애플리케이션의 행동을 기록하는 일종의 메모장이라고 보면 쉽습니다.
프로그램이 실행되면서 어떤 일이 일어났는지, 문제가 발생했는지 등을 기록하여,
후에 문제를 추적하고 해결하는 데 도움을 줍니다.
- 운영 환경에서의 문제 진단: System.out.println은 개발 단계에서는 유용할 수 있지만,
운영 환경에서는 로그를 사용하여 파일에 기록되거나 중앙 로깅 시스템에서 관리되기 때문에 오류를 쉽게 추적할 수 있습니다. - 로그 레벨 설정: 로깅 프레임워크를 사용하면 로그 레벨을 설정할 수 있습니다.
이는 특정 수준의 로그 메시지만 기록하게 하여, 필요 없는 정보를 줄이고, 중요한 정보를 집중할 수 있게 도와줍니다. - 통합 관리: 로그 파일은 통합된 관리 및 분석 도구와 연동하여 또 다른 통계로 사용될 수 있습니다.
1. JAVA에서 log 선언 : LoggerFactory.getLogger(ooo.class);
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass {
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
public void someMethod() {
logger.info("This is an JJU's LOGGER info message.");
logger.error("This is an error message.", new RuntimeException("Example exception"));
}
}
- LoggerFactory.getLogger(MyClass.class)는 현재 클래스에 대한 로거 인스턴스를 생성합니다.
- logger.info, logger.error 등 다양한 메서드를 사용하여 로그 레벨에 맞는 로그 메시지를 기록할 수 있습니다.
로그 레벨:
- TRACE: 아주 상세한 정보. 보통 개발 중에만 사용됩니다.
- DEBUG: 디버깅 정보를 출력합니다.
- INFO: 일반적인 정보 메시지로, 애플리케이션의 정상적인 동작을 기록합니다.
- WARN: 경고 메시지, 잠재적인 문제를 나타냅니다. (에러X)
- ERROR: 에러 메시지, 시스템이나 애플리케이션의 문제를 기록합니다.
logging.level.root=INFO
logging.level.com.example.myapp=DEBUG
Spring Boot의 application.properties 파일에서 로그 레벨을 설정할 수 있습니다.
전체 애플리케이션의 root 로그 레벨을 INFO로 설정하고,
level 다음으로 쓰는 패키지의 로그 레벨을 DEBUG로 설정합니다.
각자의 상황에 맞게 변경해서 사용하시면 됩니다.
2. log 의 출력 위치 설정하기
파일로 로그를 기록하기 위해서는 application.properties에서 다음과 같이 설정할 수 있습니다:
logging.file.name=app.log
logging.file.path=/var/log/myapp
로그를 app.log 파일에 기록하고, 파일의 경로를 /var/log/myapp으로 지정합니다.
이제 원하는 곳에 임포트 아래 두개 하고,
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
선언하고
클래스에서 logger.OOO (로그레벨)을 지정해서 맘껏 사용하시면 됩니다!!!
logger.info("OOO 기록");
3. 로그를 대체할 수 있는것은 무엇이 있을까?
로그를 대체할 수 있는 방법에 대해 알아보았습니다.
3-1 . Spring Boot Actuator
Spring Boot Actuator는 애플리케이션의 상태와 메트릭을 모니터링하는 도구입니다.
이 도구를 사용하면 애플리케이션의 상태를 실시간으로 확인하고, 로그 레벨을 동적으로 조정할 수 있습니다.
예시:
- 상태 확인: Actuator를 사용하면 애플리케이션의 다양한 상태 정보를 웹 인터페이스나 API를 통해 확인할 수 있습니다.
예를 들어, /actuator/health 엔드포인트를 호출하면 애플리케이션의 건강 상태를 확인할 수 있습니다. - 로그 레벨 조정: /actuator/loggers 엔드포인트를 통해 로그 레벨을 실시간으로 변경할 수 있습니다.
예를 들어, /actuator/loggers/com.example.myapp에 POST 요청을 보내 DEBUG 레벨로 변경할 수 있습니다.
* Actuator 설정 방법:
1. pom.xml 또는 build.gradle에 Actuator 의존성을 추가합니다.
xml의 dependency 추가!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2 .application.properties 파일에 Actuator 엔드포인트를 활성화합니다.
management.endpoints.web.exposure.include=*
Actuator는 기본적으로 HTTP 엔드포인트를 통해 정보를 제공합니다.
설정 후에는 이 엔드포인트를 호출하여 정보를 확인할 수 있습니다.
위의 설명대로 application.properties 파일에서 Actuator 엔드포인트를 활성화하는 기본적인 설정을 합니다.
# Actuator의 모든 엔드포인트를 노출합니다.
management.endpoints.web.exposure.include=*
# Actuator의 엔드포인트를 사용할 수 있는 주소를 설정합니다.
management.endpoints.web.base-path=/actuator
이 설정은 Actuator의 모든 엔드포인트를 /actuator 경로 하에 노출합니다.
예를 들어, http://localhost:8080/actuator/health에서 헬스 체크 정보를 확인할 수 있습니다.
Spring Boot Actuator에서 제공하는 주요 모니터링 요소는 아래와 같습니다~!
/actuator/health | 애플리케이션의 건강 상태를 확인합니다. 데이터베이스, 메시지 브로커 등의 상태를 포함하여 전체 시스템의 상태를 제공합니다. |
/actuator/info | 애플리케이션의 메타데이터(버전, 빌드 정보 등)를 제공합니다. 사용자 정의 정보도 추가할 수 있습니다. |
/actuator/metrics | 애플리케이션의 성능 메트릭 (예: 메모리 사용량, 요청 수 등)을 제공합니다. |
/actuator/loggers | 현재 로그 레벨을 조회하고, 동적으로 로그 레벨을 변경할 수 있습니다. |
/actuator/env | 애플리케이션의 환경 변수 및 구성 속성 정보를 제공합니다. |
/actuator/threaddump | 현재 JVM의 스레드 덤프를 제공합니다. 스레드 상태를 분석하여 문제를 진단하는 데 유용합니다. |
/actuator/auditevents | 애플리케이션에서 발생한 감사 이벤트(로그인, 권한 변경 등)를 조회할 수 있습니다. |
/actuator/heapdump | JVM 힙 덤프를 생성하여 메모리 사용 상황을 분석할 수 있습니다. |
서비스 운영에서 모니터링은 필수적인 요소입니다. 하지만 모니터링 기능을 위해 별도로 엔드포인트를 개발하거나 기능을 추가하는 데 많은 시간을 소요한다면, 효율성이 떨어질 수 있습니다. 이러한 문제를 해결하기 위해 Spring Boot에서는 spring-boot-actuator 모듈을 제공합니다. 이 모듈은 모니터링 기능을 지원할 뿐만 아니라, 서비스의 일부 설정을 실시간으로 조작할 수 있는 기능도 함께 제공합니다.
로그와 Actuator의 공통점과 차이점을 표로 보여드리겠습니다.
특징 | 로그 (Log) | Actuator | |
1 | 기능 | 애플리케이션의 실행 중 이벤트, 오류, 정보 기록 | 애플리케이션의 상태, 성능 메트릭, 설정 관리 |
2 | 목적 | 문제 진단 및 추적, 디버깅 | 애플리케이션의 상태 모니터링, 메트릭 수집 및 관리 |
3 | 정보 제공 방식 | 텍스트 기반으로 로그 파일이나 콘솔에 기록됨 | RESTful 웹 엔드포인트를 통해 실시간으로 조회 |
4 | 주기성 | 로그 메시지는 실시간으로 기록되지만, 과거의 로그를 분석하려면 로그 파일을 열어야 함 |
실시간으로 상태 및 메트릭을 조회할 수 있음 |
5 | 설정 및 구성 | 로그 레벨, 출력 형식, 로그 파일 위치 등을 설정 (`logback.xml`, `log4j2.xml`, `application.properties` 등) | `application.properties` 파일을 통해 엔드포인트를 활성화하거나 비활성화, 설정 |
6 | 동적 설정 | 일반적으로 애플리케이션 재시작 후 로그 레벨 적용 | 실시간으로 엔드포인트를 통해 설정 변경 가능 (예: 로그 레벨 변경) |
7 | 출력 형태 | 로그 메시지 (정보, 경고, 오류 등) | JSON 형식의 상태 정보, 메트릭, 설정 등 |
그럼 오늘도 수고하셨습니다~
'백엔드 관련' 카테고리의 다른 글
[웹 로딩 속도 개선해보기] 1. 이미지 파일 최적화 (2) | 2024.09.11 |
---|---|
[VSCode] 깃에 http clone 주소가 있을 때 코드를 한번 열어보자 초급반 (0) | 2024.09.10 |
[java] GOOGLE OTP 서비스 도입 초기 설정하기 (103) | 2024.08.01 |
[jar] 자르 파일 인터넷에서 다운받고 dependency 추가 할 때 (128) | 2024.07.17 |
[java] GOOGLE OTP란? 구글 인증 서비스 도입 방법 (One-Time Password) (66) | 2024.07.16 |