백엔드 관련

[java 오류 찾기] Logger 선언 & Actuator

jju_developer 2024. 8. 16. 22:07
728x90

안녕하세요 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 형식의 상태 정보, 메트릭, 설정 등

 

 

그럼 오늘도 수고하셨습니다~

728x90