IT Developer/Node.js

Node.js 기초 <18. 중앙 집중형 로그 관리와 APM(Application Performance Monitoring)>

TEMA_ 2025. 3. 20. 16:42
반응형

노드 Node.js

18. 중앙 집중형 로그 관리와 APM(Application Performance Monitoring) 

 

안녕하세요! 태마입니다.

Node.js 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

노드 Node.js

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

1. 중앙 집중형 로그 관리가 필요한 이유

마이크로서비스 아키텍처(MSA)에서는 여러 개의 서비스가 개별적으로 실행되기 때문에
각 서비스의 로그를 한 곳에서 통합적으로 관리하고 모니터링하는 시스템이 필요합니다.

📌 로그 관리 시스템이 필요한 이유
서비스 장애 분석 → 에러 및 예외 발생 시 빠르게 원인 파악 가능
보안 및 감시 → API 호출 내역 및 사용자의 행동 분석 가능
성능 모니터링 → 응답 시간, 요청량 등의 실시간 데이터 수집

전통적인 로그 관리 방식 vs 중앙 집중형 로그 관리

구분로컬 로그 파일중앙 집중형 로그 관리

로그 저장 위치 개별 서비스의 로그 파일 중앙 서버 또는 클라우드 저장소
검색 및 분석 개별 서비스에서 수동으로 분석 대시보드를 통해 실시간 분석 가능
확장성 서비스가 많아질수록 관리 어려움 수많은 서비스의 로그를 효율적으로 저장

📌 로그를 중앙에서 관리하면, MSA 환경에서도 서비스 로그를 쉽게 분석하고 모니터링 가능!

✅ 여기까지 로그 관리 시스템의 개념과 필요성을 배웠습니다!
👉 "그렇다면, 실제로 중앙 집중형 로그 시스템을 어떻게 구축할까?"
2부에서 Winston, Morgan, ELK Stack, Grafana Loki를 활용한 로그 수집 방법을 배워봅시다!

반응형

 

2. 상세 주제 정리

 

1. Node.js에서 로그 관리 기본 설정 (winston + morgan)

1) 패키지 설치

$ npm install winston morgan

📌 winston → 로그 파일 저장, morgan → HTTP 요청 로깅

2) winston을 활용한 로그 저장

const winston = require("winston");

const logger = winston.createLogger({
  level: "info",
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: "logs/error.log", level: "error" }),
    new winston.transports.File({ filename: "logs/combined.log" })
  ]
});

logger.info("서버가 시작되었습니다!");
logger.error("에러 발생!");

📌 로그를 logs/ 폴더에 저장하며, 에러 로그는 error.log에 별도로 저장!

3) HTTP 요청 로깅 (morgan 연동)

const express = require("express");
const morgan = require("morgan");

const app = express();

app.use(morgan("combined", { stream: winston.createLogger().transports[0].stream }));

📌 모든 HTTP 요청을 winston과 연동하여 로그 파일에 저장 가능!


 

2. ELK Stack을 활용한 로그 수집 (Elasticsearch + Logstash + Kibana)

1) ELK Stack 구성 요소
Elasticsearch → 로그를 저장하는 데이터베이스
Logstash → 로그를 수집하고 변환하는 역할
Kibana → 로그를 시각적으로 분석할 수 있는 대시보드

2) Docker를 활용한 ELK Stack 실행

$ docker-compose up -d

📌 ELK Stack을 실행하면 http://localhost:5601에서 Kibana 대시보드를 확인 가능!

3) Logstash를 이용한 로그 수집 설정 (logstash.conf)

input {
  file {
    path => "/var/logs/app.log"
    start_position => "beginning"
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "nodejs-logs"
  }
}

📌 Node.js에서 생성한 로그 파일을 Logstash가 읽고, Elasticsearch에 저장!


 

3. Grafana Loki를 활용한 로그 수집 및 시각화

1) Grafana + Loki + Promtail 설치 (Docker Compose 사용)

$ docker-compose up -d loki promtail grafana

📌 Grafana에서 Loki를 통해 로그를 검색하고 시각화 가능!

2) Promtail 설정 (promtail-config.yml)

scrape_configs:
  - job_name: "nodejs-logs"
    static_configs:
      - targets: ["localhost"]
        labels:
          job: "nodejs-app"
          __path__: "/var/logs/*.log"

📌 Promtail이 Node.js 로그 파일을 읽고 Loki에 저장하도록 설정!

3) Grafana에서 Loki 데이터 소스 추가
1️⃣ Grafana에서 Data Sources → Add Data Source → Loki 선택
2️⃣ http://loki:3100 입력 후 저장

📌 Grafana에서 nodejs-app 로그를 실시간으로 확인 가능!


 

4. 로그 모니터링 & APM (Application Performance Monitoring) 적용

1) APM이란?
APM(Application Performance Monitoring)은 애플리케이션의 성능을 분석하고, 오류 및 병목 현상을 감지하는 시스템입니다.
대표적인 APM 도구로 New Relic, Datadog, Prometheus + Grafana가 있습니다.

2) Prometheus + Grafana를 활용한 APM 설정

$ docker-compose up -d prometheus grafana

📌 Grafana에서 Prometheus 데이터를 수집하여 실시간 성능 모니터링 가능!

3) Express 애플리케이션에서 Prometheus 메트릭 추가

const client = require("prom-client");
const express = require("express");
const app = express();

const httpRequestCounter = new client.Counter({
  name: "http_requests_total",
  help: "Total number of HTTP requests"
});

app.use((req, res, next) => {
  httpRequestCounter.inc();
  next();
});

app.get("/metrics", async (req, res) => {
  res.set("Content-Type", client.register.contentType);
  res.end(await client.register.metrics());
});

📌 /metrics 엔드포인트에서 실시간 요청 수를 확인 가능!

4) Grafana에서 Prometheus 데이터 시각화
1️⃣ Grafana에서 Data Sources → Add Data Source → Prometheus 선택
2️⃣ http://prometheus:9090 입력 후 저장

📌 Grafana에서 애플리케이션의 응답 속도, 요청 수 등의 실시간 메트릭을 확인 가능!


 

5. 중앙 집중형 로그 관리 & APM 활용 시 고려할 점

1) 로그 레벨(Level) 설정
✔ info, warn, error 등 다양한 로그 레벨을 설정하여 중요도를 구분

2) 로그 데이터 보존 기간 관리
✔ 오래된 로그는 자동으로 삭제 또는 압축 저장하도록 설정

3) 보안 및 접근 제어
✔ 로그 데이터는 외부 노출을 방지하고, 관리자만 접근 가능하도록 설정

📌 로그 데이터를 효과적으로 관리하면, 장애 감지 및 성능 최적화가 가능!


✅ 여기까지 중앙 집중형 로그 관리와 APM 모니터링 방법을 배웠습니다!
👉 "그렇다면, Node.js에서 CI/CD(Continuous Integration & Deployment)를 어떻게 구현할까?"
다음 회차에서 GitHub Actions, Docker, Jenkins를 활용한 CI/CD 구축 방법을 배워봅시다!

반응형