Node.js · 2026-04-07

Node.js 로그 중앙화와 ELK/EFK 구축

Node.js 애플리케이션의 로그를 중앙에 모으고 분석하는 절차와 구성 요소를 실무 관점에서 정리한 로그 중앙화 솔루션

작성일 : 2026-04-07 ㆍ 작성자 : 관리자
post
목차

개요

애플리케이션이 커질수록 로그 관리가 중요해진다. 본문에서는 Node.js 환경에서 ELK와 EFK를 이용해 로그를 중앙화하는 전체 흐름을 설명한다. 처음 접하는 개발자도 이해하도록 아키텍처, 수집기 설정, 애플리케이션 연동 방법을 단계별로 다룬다. 핵심 키워드는 Node 로그 ELK 스택 연동, EFK 로그 수집 Node.js, Winston Elasticsearch 설정이다.

왜 로그 중앙화가 필요한가

분산된 서버에서 로그를 각 호스트마다 보관하면 검색과 장기 분석이 어렵다. 중앙화하면 다음과 같은 이점이 있다.

  • 통합 검색과 필터링으로 문제 원인 분석 속도 향상
  • 지표와 경보 연계로 운영 안정성 확보
  • 로그 보관 정책과 접근 제어로 감사 체계 구축

ELK와 EFK의 차이

두 스택은 기본 개념은 같다. 로그 수집기만 다르다.

  • ELK: Logstash 사용. 복잡한 파싱과 변환에 유리
  • EFK: Fluentd/Fluent Bit 사용. 경량·컨테이너 친화적

전체 아키텍처

일반적인 구성은 다음과 같다.

  • 애플리케이션(Node.js): 구조화된 JSON 로그 출력
  • 수집기(Fluentd 또는 Logstash): 로그 수집과 전처리
  • 저장소(Elasticsearch): 색인·검색
  • 대시보드(Kibana): 시각화와 탐색

Node.js 로그 설계

구조화 로그는 검색과 분석에 유리하다. 레벨(level), 타임스탬프(timestamp), 서비스명(service), 요청 ID(requestId) 같은 필드를 포함하면 좋다. 대표적인 라이브러리는 Winston이다.

Winston + Elasticsearch 전송 예시

아래는 winston과 winston-elasticsearch를 사용한 간단한 설정 예제이다.

const winston = require('winston');
const { ElasticsearchTransport } = require('winston-elasticsearch');

const esTransportOpts = {
  level: 'info',
  clientOpts: { node: 'http://elasticsearch:9200' },
  indexPrefix: 'node-app-logs'
};

const logger = winston.createLogger({
  format: winston.format.json(),
  transports: [new ElasticsearchTransport(esTransportOpts)]
});

logger.info({ message: 'server started', service: 'users', requestId: 'abc123' });

EFK 환경에서 Fluentd 설정

컨테이너 환경에서는 Fluentd를 사용해 stdout 또는 파일 로그를 수집하고 Elasticsearch로 전달하는 패턴이 흔하다. 다음은 Fluentd의 기본 입력·출력 설정 예시이다.

<source>
  @type forward
  port 24224
</source>

<match **>
  @type elasticsearch
  host elasticsearch
  port 9200
  logstash_format true
  index_name fluentd
</match>

Docker Compose 예시

간단한 로컬 실습용 Docker Compose 구성은 다음과 같다. Elasticsearch, Kibana, Fluentd, 그리고 Node 앱을 포함한다.

version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
    environment:
      - discovery.type=single-node
    ports:
      - 9200:9200

  kibana:
    image: docker.elastic.co/kibana/kibana:7.17.0
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch

  fluentd:
    image: fluent/fluentd:v1.14
    volumes:
      - ./fluentd/conf:/fluentd/etc
    ports:
      - 24224:24224
    depends_on:
      - elasticsearch

  app:
    build: ./app
    environment:
      - NODE_ENV=production
    depends_on:
      - fluentd

검색과 대시보드 구성

Kibana에서 인덱스 패턴을 생성하면 필드 매핑을 확인하고 대시보드를 만들 수 있다. 빠른 문제 대응을 위해 다음 뷰를 권장한다.

  • 서비스별 에러 수 추이
  • 상위 에러 메시지와 빈도
  • 지연 시간 또는 응답 코드 분포

운영 팁

  • 로그 레벨과 민감 정보 필터링 정책을 명확히 한다
  • 인덱스 수명주기(ILM)를 설정해 저장 비용을 관리한다
  • 샘플링과 로그 축약을 통해 과도한 인덱싱 방지
  • 모니터링 지표(Elasticsearch Heap, Fluentd 큐 등)를 수립

문제 해결 포인트

초기에 흔한 문제는 다음과 같다.

  • Elasticsearch 연결 실패: 네트워크와 인증 확인
  • 로그 스키마 불일치: 구조화된 로그와 매핑 일치화
  • 인덱스 급증: 고빈도 로그 샘플링 필요

결론

Node 로그 ELK 스택 연동과 EFK 로그 수집 Node.js 환경에서의 구현은 비교적 표준화되어 있다. Winston Elasticsearch 설정처럼 애플리케이션 수준에서 구조화 로그를 내보내고, 수집기에서 적절히 전처리한 뒤 Elasticsearch로 보관하면 검색과 모니터링이 크게 개선된다. 운영 시에는 보안, 인덱스 관리, 성능 지표에 꾸준히 신경 써야 한다.

Node.js 로그 ELK 스택 EFK 로그 수집 Node.js Winston Elasticsearch 설정 로그 중앙화 Node 로그 ELK 스택 연동 Fluentd 설정 Kibana 모니터링