노드 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 구축 방법을 배워봅시다!
'IT Developer > Node.js' 카테고리의 다른 글
Node.js 기초 <20. 서버리스(Serverless) 환경에서 CI/CD 구축> (0) | 2025.03.22 |
---|---|
Node.js 기초 <19. CI/CD (Continuous Integration & Deployment) 구축> (0) | 2025.03.21 |
Node.js 기초 <17. API 게이트웨이(API Gateway)와 서비스 관리> (0) | 2025.03.19 |
Node.js 기초 <16. 마이크로서비스 아키텍처(MSA)와 RabbitMQ 활용> (0) | 2025.03.18 |
Node.js 기초 <15. 작업 큐(Queue)와 백그라운드 작업 처리 (Bull 활용)> (1) | 2025.03.17 |
Node.js 기초 <14. 클라우드 스토리지(AWS S3, Firebase)와 파일 업로드> (0) | 2025.03.16 |
Node.js 기초 <13. 파일 업로드와 이미지 처리 (multer 활용)> (0) | 2025.03.15 |
Node.js 기초 <12. Express의 미들웨어와 요청 처리 흐름> (0) | 2025.03.14 |