Skip to content

TIL -2025-05-23 [콜드 스타트, 로깅 방식, Logging vs Metric, Prometheus] #74

@soheeGit

Description

@soheeGit

📌 콜드 스타트 (Cold Start)

서버리스(Serverless) 환경 또는 애플리케이션이 처음 호출될 때 발생하는 느린 응답 현상

  • 서버리스 플랫폼(AWS Lambda 등)은 요청이 없을 때 자동으로 리소스를 줄이기 위해 인스턴스를 꺼버린다.
  • 첫 요청이 오면 다시 "처음부터 시작해야 하므로 시간이 오래 걸림" → 이게 콜드 스타트

📌 로깅 방식

1. SLF4J + Logback

SLF4J

https://www.slf4j.org

  • Simple Logging Facade for Java의 약자
  • 다양한 로깅 구현체들(Logback, Log4j 등)과 연결할 수 있는 로깅 추상화 API
  • 직접 로그를 찍지는 않고, 중간 추상 계층 역할만 수행

Logback

  • SLF4J의 기본 구현체
  • Logback은 SLF4J의 제작자가 만든 로깅 구현체이며, SLF4J와 매우 밀접하게 통합
  • Spring Boot에서 기본 제공 로깅 시스템
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyService {
    private static final Logger log = LoggerFactory.getLogger(MyService.class);

    public void process() {
        log.info("정보 로그");
        log.error("에러 발생: {}", "에러 내용");
    }
}

또는 롬복 사용시

@Slf4j
public class MyService {
    public void process() {
        log.debug("디버깅 정보");
    }
}

2. JUL (java.util.logging)

  • Java SE에 기본 내장된 로깅 API
  • java.util.logging.Logger 클래스를 통해 사용
  • 추가 의존성 없이 즉시 사용 가능
import java.util.logging.Logger;

public class MyService {
    private static final Logger logger = Logger.getLogger(MyService.class.getName());

    public void process() {
        logger.info("정보 로그");
        logger.warning("경고 로그");
        logger.severe("심각한 오류");
    }
}

비교표

항목 SLF4J + Logback JUL (java.util.logging)
제공 방식 외부 라이브러리 JDK 기본 내장
주요 클래스 LoggerFactory, Logger Logger
로그 레벨 TRACE, DEBUG, INFO, WARN, ERROR FINEST, FINER, FINE, INFO, WARNING, SEVERE
성능 지연 문자열 평가 지원 → 효율적 문자열 결합 즉시 실행
설정 유연성 매우 유연 (XML/YAML 설정) 제한적 (properties 기반)
Spring Boot 통합 기본 내장, 최적화 완료 별도 설정 필요
실무 사용률 🌟 매우 높음 (사실상 표준) ❌ 낮음 (레거시, 교육용 또는 간단한 앱)

📌 Logging vs Metric

시스템의 동작을 관찰하고 문제를 진단하는 데 사용하는 두 가지 주요 모니터링 방식
이 둘은 목적과 방식이 다르며, 서로 보완적인 역할을 한다.

개념 비교

항목 Logging (로깅) Metric (메트릭)
정의 시스템의 실행 흐름이나 상태를 텍스트 형태로 기록 수치 기반의 시스템 상태 데이터를 수집하고 집계
형태 로그 메시지 (예: INFO, DEBUG, ERROR 등) 수치 값 (예: CPU 사용률, 요청 수, 평균 응답 시간 등)
목적 문제 발생 시 원인을 추적하고 디버깅 시스템 상태의 지속적인 모니터링 및 알림
저장 형식 문자열 기반 텍스트 (JSON 또는 일반 텍스트) 시계열 DB (Time Series Data)
처리 방식 이벤트 중심, 상세 로그 기록 수치 수집, 집계 및 시각화
용도 에러 분석, 비즈니스 이벤트 추적, 예외 로그 대시보드, SLA 추적, 알림 조건 설정
예시 log.error("DB 연결 실패: {}", e.getMessage()); http_requests_total = 1500, cpu_usage = 73%

Logging

log.error("User login failed for ID {}", userId);
  • 로그인 실패 이유, 사용자의 IP, 요청 파라미터 등을 남김
  • 사건의 정황을 상세히 남김
  • 디버깅과 오류 분석에 적합

Metric

  • login_failure_total{status="401"} = 43
  • avg_response_time{endpoint="/login"} = 120ms
  • 로그인 실패 횟수, 평균 응답 시간 등의 수치화된 지표
  • 그래프화, 알림 설정, 트렌드 분석에 적합

시각화나 툴

항목 Logging Metric
주요 도구 ELK Stack (Elasticsearch, Logstash, Kibana), Fluentd, Loki Prometheus, Grafana, CloudWatch, Datadog
시각화 Kibana, Grafana + Loki Grafana, CloudWatch Dashboards
알림 설정 로그 패턴 기반 알림 가능 (e.g. error > 100회) 특정 수치 임계값 기반 (e.g. CPU > 90%)

언제 무엇을 써야 하나?

목적 추천 방식
오류 추적 / 예외 확인 Logging
시스템 부하 감지 / 리소스 사용량 모니터링 Metric
사용자 행동 분석 (클릭, 로그인 시도 등) 둘 다 사용 가능 (로그로 상세히, 메트릭으로 집계)
서비스 안정성 모니터링 (SLO/SLA 추적) Metric

결론

  • Logging = 텍스트 중심, 상세 원인 분석용
  • Metric = 수치 중심, 모니터링/경보/시각화용
  • 실무에서는 둘을 병행 사용하며, Prometheus + Grafana(메트릭), ELK Stack or Loki(로깅) 조합이 많이 쓰인다.

📌 Prometheus

  • Controller.java
package org.example.bootprometheus.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    @GetMapping("/ok")
    public ResponseEntity<Void> ok() {
        return ResponseEntity.ok().build();
    }

    @GetMapping("/not-ok")
    public ResponseEntity<Void> notOk() {
        return ResponseEntity.badRequest().build();
    }
}
  • application.yml
spring:
  application:
    name: boot-prometheus
management:
  endpoints:
    web:
      exposure:
        include: prometheus,health,metrics
  endpoint:
    prometheus:
      access: unrestricted
  prometheus:
    metrics:
      export:
        enabled: true
  • prometheus.yml
global:
  scrape_interval: 15s      # 기본 수집 간격
  evaluation_interval: 15s  # 규칙 평가 간격

scrape_configs:
  - job_name: 'spring-boot-monitoring'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 10s    # 이 job의 수집 간격
    static_configs:
      - targets: ['host.docker.internal:8080']
    scrape_timeout: 5s
docker run -d --name prometheus -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
docker ps
  • postman으로 실습할 수 있다.
  • GET http://localhost:8080/ok → 200
  • GET http://localhost:8080/not-ok → 400
Image Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions