티스토리 뷰
💡 서론: 디지털 시대의 흔적, 로그 (Log)
우리가 살아가는 디지털 세상은 마치 거대한 도시와 같습니다. 수많은 시스템과 애플리케이션이 복잡하게 얽혀 상호작용하며 끊임없이 정보를 생산해냅니다. 웹사이트에 접속하고, 모바일 앱을 사용하며, 클라우드 서버에서 데이터가 오가는 이 모든 과정은 눈에 보이지 않는 디지털 흔적을 남깁니다. 우리는 이 흔적들을 로그(Log)라고 부릅니다.
로그는 시스템에서 발생하는 모든 이벤트의 기록입니다. 예를 들어, 웹 서버에 사용자가 접속한 시간, 어떤 페이지를 요청했는지, 로그인에 성공했는지 실패했는지, 데이터베이스에서 어떤 쿼리가 실행되었는지 등, 말 그대로 '발생했던 일'에 대한 시계열 기록입니다. 이 로그들은 단순한 텍스트 파일처럼 보이지만, 사실은 시스템의 건강 상태를 진단하고, 문제의 원인을 파악하며, 심지어는 미래를 예측하는 데 필요한 귀중한 정보원입니다.
하지만 문제는 이러한 로그의 양이 어마어마하다는 것입니다. 현대의 복잡한 시스템에서는 단 몇 시간 만에 수 기가바이트에서 수 테라바이트에 달하는 로그가 생성될 수 있습니다. 이렇게 방대하고 무질서한 데이터를 수동으로 분석하는 것은 불가능에 가깝습니다. 마치 거대한 도서관에서 원하는 정보를 찾기 위해 모든 책을 일일이 펼쳐보는 것과 같습니다. 이러한 배경에서 엘라스틱 스택(Elastic Stack) 기반의 로그 시스템은 단순한 로그 파일을 넘어, 이 거대한 데이터 속에서 의미 있는 통찰력을 찾아내고 시스템을 효과적으로 관리할 수 있도록 돕는 강력한 솔루션으로 등장했습니다.
비전공자부터 현업 개발자까지, 이 글을 통해 엘라스틱 스택 기반의 로그 분석이 무엇인지, 왜 중요한지, 그리고 어떻게 활용할 수 있는지에 대한 핵심 내용을 쉽고 명확하게 이해하실 수 있도록 안내하겠습니다.
엘라스틱 스택 기반의 로그 분석이란 무엇인가? 기본 개념 및 중요성
로그(Log)의 본질과 시스템 운영의 필수 요소
로그(Log)는 모든 컴퓨터 시스템, 애플리케이션, 네트워크 장치에서 발생하는 사건(event)의 디지털 기록입니다. 쉽게 비유하자면, 마치 항공기의 '블랙박스'나 건물의 '보안 감시 카메라 기록'과 같습니다. 어떤 일이 언제, 어디서, 누구에 의해, 어떻게 발생했는지에 대한 상세한 정보를 담고 있습니다.
예를 들어, 여러분이 즐겨 사용하는 웹사이트에 접속했다고 가정해봅시다. 이 짧은 순간에도 다음과 같은 로그가 생성될 수 있습니다.
- 웹 서버 로그: "사용자 [IP 주소]가 [시간]에 [웹페이지 주소]를 요청했다."
- 애플리케이션 로그: "사용자 [ID]가 [시간]에 로그인에 성공했다."
- 데이터베이스 로그: "[사용자 ID]의 요청에 따라 [특정 데이터]를 조회했다."
- 보안 로그: "알 수 없는 IP에서 [시간]에 로그인 시도 5회 실패."
이처럼 로그는 시스템의 심장 박동과 같아서, 시스템의 모든 활동을 투명하게 기록합니다. 이 기록이 없다면 우리는 시스템 내부에서 어떤 일이 벌어지고 있는지 전혀 알 수 없을 것입니다.
왜 로그 분석이 필요한가? 전통적인 방식의 한계
그렇다면 이렇게 중요한 로그를 왜 분석해야 할까요? 그리고 기존의 방식으로는 무엇이 부족했을까요?
- 문제 해결 (Troubleshooting) 및 장애 진단: 시스템에서 갑작스러운 오류가 발생했을 때, 로그는 문제의 원인을 찾아내는 가장 중요한 단서입니다. "어떤 시점에, 어떤 서비스에서, 어떤 종류의 에러가 발생했는지"를 로그를 통해 파악하고, 여러 시스템의 로그를 상호 비교함으로써 복잡한 분산 환경에서의 문제도 신속하게 진단할 수 있습니다. 예를 들어, 웹사이트가 느려졌을 때, 로그를 분석하면 특정 데이터베이스 쿼리가 너무 오래 걸리거나, 특정 API 호출에 병목 현상이 발생했음을 알아낼 수 있습니다.
- 성능 모니터링 및 최적화: 로그는 시스템의 성능 지표를 간접적으로 보여줍니다. 요청 처리 시간, 응답 시간, 자원 사용량 등에 대한 정보를 통해 시스템의 병목 구간을 식별하고, 성능 저하의 징후를 조기에 감지하여 선제적으로 대응할 수 있습니다. "평소보다 특정 API의 응답 시간이 2배 길어졌다"는 정보를 로그에서 발견한다면, 큰 장애로 이어지기 전에 시스템을 개선할 수 있는 기회를 얻는 것입니다.
- 보안 감사 및 위협 탐지: 모든 로그인 시도, 파일 접근, 시스템 설정 변경 등은 로그로 기록됩니다. 이를 통해 비정상적인 접근 패턴이나 잠재적인 보안 위협을 탐지할 수 있습니다. "갑자기 해외 IP에서 새벽 3시에 관리자 계정으로 로그인 시도가 100회 발생했다"는 로그는 심각한 보안 침해의 신호일 수 있습니다.
- 비즈니스 인사이트 도출: 로그는 IT 운영적인 측면 외에도 비즈니스적인 가치를 제공합니다. 사용자들의 서비스 이용 패턴, 가장 많이 사용되는 기능, 특정 시간대에 집중되는 서비스 등을 분석하여 마케팅 전략 수립이나 서비스 개선 방향을 결정하는 데 활용될 수 있습니다. "가장 많이 클릭되는 버튼은 무엇이고, 사용자들이 어떤 단계에서 이탈하는가?"와 같은 질문에 대한 답을 로그에서 찾을 수 있습니다.
전통적인 로그 관리의 한계점:
과거에는 각 서버에서 생성된 로그 파일을 개별적으로 확인했습니다. grep, tail 등의 명령어를 사용하여 텍스트 파일을 직접 검색하는 방식이었죠. 그러나 현대의 분산 시스템 환경에서는 이러한 방식이 다음과 같은 심각한 한계를 가집니다.
- 방대한 로그 양: 수십, 수백 대의 서버에서 매초 수백 개의 로그가 쏟아져 나오면, 사람이 수동으로 모든 로그를 확인하는 것은 불가능합니다.
- 분산된 데이터: 여러 서버에 흩어져 있는 로그를 한데 모아 분석하기 어렵습니다. 특정 문제를 진단하려면 여러 서버의 로그를 통합하여 시간순으로 정렬해야 하는데, 이는 매우 복잡하고 시간이 많이 소요됩니다.
- 비정형 데이터: 로그는 정형화되지 않은 텍스트 형태가 많습니다. 필요한 정보를 추출하고 분석하기 위한 전처리 과정이 복잡합니다.
- 가시성 부족: 텍스트 파일만으로는 로그의 전체적인 추세나 패턴을 한눈에 파악하기 어렵습니다. 시각화가 뒷받침되지 않으면 문제의 심각성을 인지하기 어렵습니다.
- 확장성 부족: 로그 데이터가 증가할수록 검색 및 분석 속도가 현저히 느려집니다.
이러한 한계점을 극복하기 위해 등장한 것이 바로 엘라스틱 스택 기반의 로그 관리 시스템입니다. 엘라스틱 스택 기반의 로그 관리 시스템은 방대한 로그 데이터를 효율적으로 수집, 저장, 분석, 시각화하여 시스템의 투명성을 확보하고 운영 효율성을 극대화하는 것을 목표로 합니다.
엘라스틱 스택 (ELK Stack): 로그 분석의 핵심 구성 요소
엘라스틱 스택(Elastic Stack), 흔히 ELK 스택이라고 불리는 이 기술 조합은 로그 분석 및 모니터링 분야에서 사실상 표준으로 자리 잡았습니다. ELK는 Elasticsearch, Logstash, Kibana 세 가지 핵심 오픈소스 프로젝트의 약자이며, 이들은 유기적으로 결합하여 강력한 데이터 처리 및 시각화 플랫폼을 제공합니다. 각 구성 요소의 역할과 이들이 어떻게 하나의 시스템으로 작동하는지 자세히 살펴보겠습니다.
1. Logstash: 데이터의 연금술사 (수집 및 정제)
Logstash는 다양한 소스에서 데이터를 수집하고, 실시간으로 변환하며, 원하는 목적지로 전송하는 개방형 서버측 데이터 처리 파이프라인입니다. 쉽게 말해, 세상 곳곳에 흩어져 있는 지저분하고 무질서한 로그 데이터를 수집하여 깨끗하게 정제하고, 분석하기 좋은 형태로 가공하여 Elasticsearch로 보내는 '데이터의 연금술사' 역할을 합니다.
주요 기능:
- 다양한 입력(Input) 소스 지원: 파일, Syslog, HTTP, Kafka, 관계형 데이터베이스 등 거의 모든 형태의 데이터 소스에서 로그를 읽어올 수 있습니다. 여러분의 웹 서버에서 생성되는
access.log파일을 실시간으로 읽어오거나, 다른 시스템에서 전송하는 네트워크 트래픽을 바로 처리할 수 있습니다. - 강력한 필터(Filter) 기능: Logstash의 핵심 기능 중 하나입니다. 수집된 원시 로그 데이터를 분석하고 변형하여 의미 있는 필드를 추출하거나, 불필요한 데이터를 제거하고, 데이터를 풍부하게(enrich) 만들 수 있습니다.
- Grok: 비정형 텍스트를 정형화된 구조로 파싱하는 데 사용되는 강력한 패턴 매칭 도구입니다. 웹 서버 로그와 같이 복잡한 텍스트에서 IP 주소, 요청 경로, 응답 코드 등을 쉽게 추출할 수 있습니다.
- Mutate: 필드의 이름 변경, 타입 변환 (문자열 -> 숫자), 필드 제거, 문자열 치환 등 다양한 데이터 변형 작업을 수행합니다.
- Geoip: IP 주소를 기반으로 지리 정보(국가, 도시, 위도, 경도 등)를 추가하여 로그에 위치 정보를 부여합니다.
- Date: 로그 타임스탬프를 Elasticsearch가 이해할 수 있는 표준 날짜 형식으로 변환합니다.
- 다양한 출력(Output) 목적지 지원: 가공된 데이터를 Elasticsearch 외에도 Kafka, Redis, S3 등 다양한 저장소로 보낼 수 있습니다.
Logstash는 이러한 기능을 통해 방대한 양의 원시 로그 데이터를 사용자가 원하는 형태로 가공하여 Elasticsearch가 효율적으로 저장하고 검색할 수 있도록 만듭니다.
2. Elasticsearch: 초고속 데이터 도서관 (저장 및 검색)
Elasticsearch는 분산형 RESTful 검색 및 분석 엔진입니다. Logstash를 통해 정제된 데이터를 저장하고, 저장된 데이터를 놀라운 속도로 검색하며, 복잡한 분석을 수행하는 '초고속 데이터 도서관'에 비유할 수 있습니다. 수십억 건의 로그 데이터 속에서도 원하는 정보를 단 몇 초 만에 찾아낼 수 있는 능력을 가지고 있습니다.
주요 기능:
- 전문 검색 (Full-text Search): 구글 검색 엔진처럼 텍스트 필드 내의 모든 단어를 인덱싱하여 빠르고 유연한 검색 기능을 제공합니다. 특정 에러 메시지나 사용자 ID를 포함하는 로그를 즉시 찾아낼 수 있습니다.
- 분산 아키텍처: 여러 대의 서버에 데이터를 분산하여 저장하고 처리할 수 있습니다. 이는 엄청난 양의 로그 데이터를 안정적으로 관리하고, 데이터 증가에 따라 손쉽게 확장할 수 있는 기반을 제공합니다. 한 서버에 문제가 생겨도 다른 서버에서 서비스가 계속되므로 안정성도 높습니다.
- JSON 문서 기반: 모든 데이터를 JSON(JavaScript Object Notation) 문서 형태로 저장합니다. JSON은 개발자 친화적이고 유연한 데이터 형식으로, 다양한 형태의 로그 데이터를 효율적으로 관리할 수 있게 합니다.
- 동적 스키마 (Dynamic Schema): 사전에 엄격한 스키마(데이터 구조)를 정의하지 않아도 데이터를 저장할 수 있으며, 필요에 따라 동적으로 필드를 추가하거나 스키마를 추론하여 관리합니다. 이는 로그 데이터처럼 비정형적이고 다양한 형태를 가지는 데이터에 특히 유리합니다.
- 실시간 분석: 데이터를 인덱싱하는 동시에 검색 및 분석이 가능합니다. 이 덕분에 시스템의 현황을 거의 실시간으로 파악하고 빠르게 대응할 수 있습니다.
- 집계(Aggregation) 기능: 특정 조건에 맞는 데이터의 개수를 세거나, 평균값을 구하거나, 최대/최소값을 찾는 등 복잡한 통계 분석을 수행할 수 있습니다. 이를 통해 "지난 1시간 동안 가장 많이 발생한 에러 메시지는 무엇인가?", "평균 응답 시간이 가장 긴 API는?"과 같은 질문에 대한 답을 얻을 수 있습니다.
Elasticsearch는 강력한 검색 및 분석 기능을 제공하여, 단순히 로그를 저장하는 것을 넘어 데이터에서 의미 있는 패턴과 통찰력을 도출할 수 있도록 합니다.
3. Kibana: 데이터를 스토리로 만드는 시각화 도구 (탐색 및 시각화)
Kibana는 Elasticsearch에 저장된 데이터를 탐색하고 시각화하며 관리하는 웹 인터페이스입니다. Logstash와 Elasticsearch가 수집하고 저장한 데이터를 아름답고 이해하기 쉬운 형태로 시각화하여, '데이터를 스토리로 만들어주는 시각화 도구' 또는 '시스템의 조종석 계기판' 역할을 합니다. Kibana가 없다면 Elasticsearch의 강력한 분석 결과는 단순한 숫자에 불과할 것입니다.
주요 기능:
- 데이터 탐색 (Discover): Elasticsearch에 저장된 원시 로그 데이터를 실시간으로 조회하고 필터링하며 탐색할 수 있습니다. 특정 키워드 검색, 시간 범위 지정, 필드 기반 필터링 등 다양한 방식으로 원하는 로그를 찾아낼 수 있습니다.
- 다양한 시각화 유형: 막대 차트, 파이 차트, 라인 차트, 히트맵, 지리적 지도 등 다채로운 시각화 옵션을 제공합니다. 이를 통해 로그 데이터의 추세, 분포, 패턴 등을 한눈에 파악할 수 있습니다.
- Metrics: 특정 지표(예: 에러 발생률, 평균 응답 시간)의 현재 값이나 추세를 표시합니다.
- Data Table: 원시 데이터를 테이블 형태로 보여줍니다.
- Maps: 지리 정보가 포함된 로그(예: 사용자 접속 IP의 위치)를 지도 위에 시각화합니다.
- 대시보드 (Dashboard): 여러 시각화를 하나의 화면에 통합하여 종합적인 시스템 모니터링 대시보드를 구축할 수 있습니다. 웹 서버의 트래픽, 애플리케이션의 에러율, 데이터베이스의 성능 지표 등을 한 곳에서 동시에 확인하며 시스템 전반의 건강 상태를 모니터링할 수 있습니다.
- Canvas: 프레젠테이션처럼 데이터를 스토리텔링 형식으로 시각화할 수 있는 기능입니다.
- Alerting & Machine Learning (유료 기능 포함): 특정 임계값을 초과하는 이벤트 발생 시 알림을 보내거나, 로그 데이터의 비정상적인 패턴을 자동으로 탐지하는 고급 기능도 제공합니다.
Kibana는 복잡한 로그 데이터를 직관적인 그래프와 차트로 변환하여, 비기술적인 사용자들도 시스템의 상태를 쉽게 이해하고, 잠재적인 문제를 신속하게 파악할 수 있도록 돕습니다.
ELK Stack의 유기적인 작동 방식
이 세 가지 구성 요소는 다음과 같이 유기적으로 협력하여 완전한 로그 분석 시스템을 구축합니다.
- Logstash (데이터 수집 및 정제): 각 서버와 애플리케이션에서 발생하는 로그 데이터를 실시간으로 수집합니다. 수집된 데이터는 Logstash의 필터링 기능을 통해 필요한 정보만 추출하고, 일관된 형식으로 정규화되며, 불필요한 정보는 제거됩니다. 마치 원유를 정제하여 휘발유, 경유 등으로 나누는 과정과 같습니다.
- Elasticsearch (데이터 저장 및 검색): Logstash를 통해 정제된 데이터는 Elasticsearch로 전송되어 효율적인 검색과 분석을 위해 인덱싱됩니다. Elasticsearch는 이 데이터를 분산 환경에 저장하여 대량의 데이터 처리와 빠른 검색을 가능하게 합니다. 정제된 휘발유를 대규모 저장소에 효율적으로 보관하는 것에 비유할 수 있습니다.
- Kibana (데이터 탐색 및 시각화): Elasticsearch에 저장된 데이터는 Kibana 웹 인터페이스를 통해 사용자에게 직관적으로 제시됩니다. 사용자는 Kibana에서 원하는 데이터를 검색하고, 다양한 그래프와 차트를 통해 시각화하며, 종합적인 대시보드를 구축하여 시스템의 상태를 한눈에 모니터링할 수 있습니다. 마치 휘발유로 자동차의 엔진을 구동하고, 운전석 계기판을 통해 차량의 상태를 파악하는 것과 같습니다.
이러한 ELK 스택의 조합은 분산된 환경에서 대규모 로그 데이터를 처리하고 분석하는 데 있어 매우 강력하고 유연한 솔루션을 제공합니다. 다음 섹션에서는 이 ELK 스택을 직접 구축하고 로그를 시각화하는 간단한 예제를 살펴보겠습니다.
실전 예제: 엘라스틱 스택 기반의 로그 수집 및 시각화 가이드
이번 섹션에서는 ELK 스택을 활용하여 실제 로그 데이터를 수집하고, Elasticsearch에 저장한 다음, Kibana로 시각화하는 간단한 실전 예제를 소개합니다. 비전공자도 쉽게 따라 할 수 있도록 Docker Compose를 이용하여 환경을 구축하고, 간단한 웹 서버 로그를 시뮬레이션하여 진행하겠습니다.
1. 사전 준비: Docker 설치
이 예제를 실행하려면 여러분의 시스템에 Docker와 Docker Compose가 설치되어 있어야 합니다. 아직 설치되지 않았다면, 아래 링크를 참고하여 설치를 진행해주세요.
- Docker 설치 가이드: https://docs.docker.com/get-docker/
- Docker Compose 설치 가이드: https://docs.docker.com/compose/install/
2. ELK 스택 환경 설정 (docker-compose.yml)
새로운 디렉터리를 만들고 docker-compose.yml 파일을 생성합니다. 이 파일은 Elasticsearch, Kibana, Logstash 컨테이너를 정의하고 상호 연결하는 역할을 합니다.
# docker-compose.yml
version: '3.8' # Docker Compose 파일 형식 버전을 지정합니다.
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
container_name: elasticsearch
environment:
- xpack.security.enabled=false # 개발 목적으로 보안 비활성화 (운영 환경에서는 반드시 활성화)
- discovery.type=single-node # 단일 노드 환경 설정
- ES_JAVA_OPTS=-Xms512m -Xmx512m # Elasticsearch 힙 메모리 설정 (시스템 메모리에 따라 조절)
ports:
- "9200:9200" # Elasticsearch HTTP API 포트
- "9300:9300" # Elasticsearch TCP 통신 포트
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data # 데이터 영속성을 위한 볼륨
networks:
- elk-network
kibana:
image: docker.elastic.co/kibana/kibana:8.11.0
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200 # Elasticsearch 연결 주소
ports:
- "5601:5601" # Kibana 웹 UI 포트
networks:
- elk-network
depends_on:
- elasticsearch # Elasticsearch 컨테이너가 먼저 시작되도록 설정
logstash:
image: docker.elastic.co/logstash/logstash:8.11.0
container_name: logstash
environment:
- xpack.monitoring.enabled=false # 개발 목적으로 모니터링 비활성화
- LS_JAVA_OPTS="-Xms256m -Xmx256m" # Logstash 힙 메모리 설정
volumes:
- ./logstash/config:/usr/share/logstash/config # Logstash 설정 파일 마운트
- ./logstash/pipeline:/usr/share/logstash/pipeline # Logstash 파이프라인 설정 파일 마운트
- ./sample_logs:/usr/share/logstash/sample_logs # 샘플 로그 파일 마운트
networks:
- elk-network
ports:
- "5044:5044" # Filebeat 등 외부 로그 수집기 연결 포트 (예제에서는 사용 안함)
depends_on:
- elasticsearch # Elasticsearch 컨테이너가 먼저 시작되도록 설정
volumes:
elasticsearch-data: # Elasticsearch 데이터 볼륨 정의
networks:
elk-network: # 컨테이너 간 통신을 위한 네트워크 정의
코드 설명:
version: Docker Compose 파일 형식 버전입니다.services: 실행할 컨테이너들을 정의합니다.elasticsearch:image: Elastic사의 공식 Elasticsearch 8.11.0 이미지를 사용합니다.environment: 환경 변수 설정.xpack.security.enabled=false는 개발 편의를 위해 보안 기능을 비활성화합니다. 운영 환경에서는 보안 설정을 반드시 활성화해야 합니다.discovery.type=single-node는 단일 노드 클러스터로 설정합니다.ports: 호스트 머신의 9200 포트를 컨테이너의 9200 포트와 연결합니다.volumes:elasticsearch-data라는 Docker 볼륨을 사용하여 Elasticsearch 데이터가 컨테이너 재시작 후에도 유지되도록 합니다.
kibana:image: Kibana 8.11.0 이미지를 사용합니다.environment:ELASTICSEARCH_HOSTS를 설정하여 Kibana가 Elasticsearch 컨테이너에 접근할 수 있도록 합니다.elasticsearch는 Docker Compose 네트워크에서 컨테이너 이름으로 해석됩니다.ports: 호스트 머신의 5601 포트를 Kibana 웹 UI 포트와 연결합니다.depends_on: Elasticsearch가 먼저 시작되도록 의존성을 설정합니다.
logstash:image: Logstash 8.11.0 이미지를 사용합니다.volumes:./logstash/config: 호스트의logstash/config디렉터리를 컨테이너 내부의 설정 디렉터리에 마운트합니다../logstash/pipeline: 호스트의logstash/pipeline디렉터리를 컨테이너 내부의 파이프라인 설정 디렉터리에 마운트합니다../sample_logs: 예제 로그 파일을 Logstash 컨테이너 내부로 읽어오기 위해 마운트합니다.
depends_on: Elasticsearch가 먼저 시작되도록 의존성을 설정합니다.
volumes: Docker 볼륨을 정의하여 컨테이너가 삭제되어도 데이터가 유지되도록 합니다.networks: 컨테이너들이 서로 통신할 수 있는 가상 네트워크를 정의합니다.
3. Logstash 파이프라인 설정 (logstash/pipeline/logstash.conf)
docker-compose.yml 파일이 있는 동일한 디렉터리 안에 logstash 폴더를 만들고, 그 안에 pipeline 폴더를 만듭니다. 그리고 logstash/pipeline 폴더 안에 logstash.conf 파일을 생성합니다. 이 파일은 Logstash가 로그를 어떻게 처리할지 정의합니다.
# logstash/pipeline/logstash.conf
input {
# 호스트의 ./sample_logs/web_access.log 파일을 읽어옵니다.
# Logstash 컨테이너 내부 경로: /usr/share/logstash/sample_logs/web_access.log
file {
path => "/usr/share/logstash/sample_logs/web_access.log"
start_position => "beginning" # Logstash 시작 시 파일 처음부터 읽기
sincedb_path => "/dev/null" # 테스트를 위해 sincedb (읽은 위치 기록) 비활성화
codec => plain { charset => "UTF-8" } # 인코딩 설정
}
}
filter {
# 웹 서버 로그 형식을 파싱합니다. (예: Apache Common Log Format)
grok {
match => { "message" => '%{IPORHOST:client_ip} %{HTTPUSERID:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code} %{NUMBER:bytes_sent}' }
# 타임스탬프 필드를 Logstash 표준 @timestamp 필드로 변환
remove_field => ["@version"]
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] # 그록으로 추출한 타임스탬프 형식 지정
target => "@timestamp" # Logstash의 기본 타임스탬프 필드로 설정
}
# 추출된 response_code와 bytes_sent를 문자열에서 숫자로 변환
mutate {
convert => { "response_code" => "integer" }
convert => { "bytes_sent" => "integer" }
}
# IP 주소로부터 지리 정보 추가 (옵션)
# 참고: 샘플 로그에 사용된 192.168.x.x 대역은 사설 IP이므로, GeoIP 정보가 표시되지 않습니다.
# 공용 IP를 사용해야 GeoIP 필터의 효과를 확인할 수 있습니다.
geoip {
source => "client_ip"
target => "geoip"
}
}
output {
# Elasticsearch로 데이터를 보냅니다.
elasticsearch {
hosts => ["elasticsearch:9200"] # Elasticsearch 컨테이너 주소
index => "web_access_logs-%{+YYYY.MM.dd}" # 날짜 기반 인덱스 생성
# user => "elastic" # 보안 활성화 시 사용자 정보
# password => "changeme" # 보안 활성화 시 비밀번호
}
# 개발 및 디버깅을 위해 콘솔에도 출력
stdout { codec => rubydebug }
}
코드 설명:
input섹션:file플러그인을 사용하여web_access.log파일을 읽어옵니다.path: Logstash 컨테이너 내부에서 로그 파일의 경로를 지정합니다.start_position => "beginning": Logstash가 시작될 때 파일의 처음부터 로그를 읽도록 합니다. (테스트용)sincedb_path => "/dev/null": Logstash가 파일의 어디까지 읽었는지 기록하는sincedb파일을 사용하지 않도록 설정합니다. 이는 테스트 환경에서 로그를 여러 번 읽을 수 있도록 합니다. (운영 환경에서는 이 옵션을 사용하지 않아야 합니다.)codec => plain { charset => "UTF-8" }: 인코딩 설정.
filter섹션:grok: 웹 서버의Common Log Format과 유사한 패턴으로message필드를 파싱합니다.IPORHOST,HTTPUSERID,HTTPDATE,WORD,URIPATHPARAM,NUMBER등 미리 정의된 패턴을 사용하여client_ip,method,request,response_code등의 필드를 추출합니다.date:grok으로 추출한timestamp필드를 Logstash가 인식하는 표준 시간 형식(@timestamp)으로 변환합니다. 이는 Kibana에서 시간 기반 검색 및 시각화를 가능하게 합니다.mutate:response_code와bytes_sent필드의 타입을string에서integer로 변환하여 숫자 기반의 통계 분석이 가능하도록 합니다.geoip:client_ip필드를 기반으로 IP 주소의 지리적 위치 정보(국가, 도시 등)를 추가합니다. 이는 나중에 Kibana 지도 시각화에 유용합니다. (단, 사설 IP는 지리 정보가 표시되지 않습니다.)
output섹션:elasticsearch: 가공된 데이터를 Elasticsearch 컨테이너로 전송합니다.hosts: Elasticsearch 컨테이너의 주소입니다.index: 데이터를 저장할 Elasticsearch 인덱스 이름을 정의합니다.web_access_logs-%{+YYYY.MM.dd}는 매일 새로운 인덱스가 생성되도록 합니다 (예:web_access_logs-2023.10.27).stdout: 디버깅 목적으로 Logstash가 처리한 로그를 터미널에도 출력합니다.
4. 샘플 로그 파일 생성 (sample_logs/web_access.log)
logstash 폴더와 같은 레벨에 sample_logs 폴더를 만들고, 그 안에 web_access.log 파일을 생성합니다. 다음 내용을 파일에 붙여넣습니다.
# sample_logs/web_access.log
192.168.1.1 - admin [26/Oct/2023:10:05:01 +0900] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - guest [26/Oct/2023:10:05:05 +0900] "GET /products/category/electronics HTTP/1.1" 200 5678
192.168.1.3 - - [26/Oct/2023:10:05:10 +0900] "POST /api/order HTTP/1.1" 201 120
192.168.1.4 - user1 [26/Oct/2023:10:05:15 +0900] "GET /images/logo.png HTTP/1.1" 200 345
192.168.1.5 - admin [26/Oct/2023:10:05:20 +0900] "PUT /api/users/123 HTTP/1.1" 403 0
192.168.1.1 - guest [26/Oct/2023:10:05:25 +0900] "GET /contact.html HTTP/1.1" 200 987
192.168.1.6 - - [26/Oct/2023:10:05:30 +0900] "GET /nonexistent HTTP/1.1" 404 250
192.168.1.7 - user2 [26/Oct/2023:10:05:35 +0900] "GET /products/item/apple-watch HTTP/1.1" 200 7890
192.168.1.8 - - [26/Oct/2023:10:05:40 +0900] "GET /index.html HTTP/1.1" 200 1100
192.168.1.9 - user1 [26/Oct/2023:10:05:45 +0900] "GET /admin HTTP/1.1" 401 0
192.168.1.10 - guest [26/Oct/2023:10:05:50 +0900] "GET /about.html HTTP/1.1" 200 400
5. ELK 스택 실행
모든 설정 파일 준비가 끝났다면, docker-compose.yml 파일이 있는 디렉터리에서 터미널을 열고 다음 명령어를 실행합니다.
docker compose up -d
이 명령어는 백그라운드에서 Elasticsearch, Kibana, Logstash 컨테이너를 시작합니다. 컨테이너들이 모두 준비될 때까지 몇 분 정도 시간이 걸릴 수 있습니다. docker compose ps 명령어로 컨테이너 상태를 확인할 수 있습니다.
6. Kibana에서 로그 시각화하기
- Kibana 접속: 웹 브라우저를 열고
http://localhost:5601로 접속합니다. Kibana UI가 나타날 것입니다. - 인덱스 패턴 생성: Kibana 왼쪽 메뉴에서
Stack Management->Index Patterns로 이동한 후Create index pattern버튼을 클릭합니다.Index pattern name필드에web_access_logs-*를 입력합니다. (Logstash에서 설정한 인덱스 패턴과 일치해야 합니다.)Next step을 클릭합니다.Time field드롭다운에서@timestamp를 선택하고Create index pattern을 클릭합니다.
- 로그 탐색 (Discover): 왼쪽 메뉴에서
Analytics->Discover로 이동합니다.- 이제 Elasticsearch에 저장된 웹 접근 로그들이 시간순으로 나열되는 것을 볼 수 있습니다.
- 오른쪽 상단의 시간 범위 선택기에서
Last 15 minutes나Last 1 hour등으로 시간을 조정하여 모든 로그가 보이도록 할 수 있습니다. - 좌측 필드 목록에서
client_ip,response_code,request,method등 Logstash에서 추출한 필드들이 제대로 보이는지 확인합니다.
- 간단한 시각화 구축 (Visualize):
- 왼쪽 메뉴에서
Analytics->Visualize로 이동한 후Create visualization을 클릭합니다. Vertical bar차트를 선택합니다.Source로web_access_logs-*인덱스 패턴을 선택합니다.Y-axis에Count(기본값)를 설정합니다. 이는 요청의 총 개수를 나타냅니다.X-axis에Date Histogram을 선택하고Field는@timestamp(기본값)를,Interval은Auto나1 minute로 설정합니다. 이는 시간 경과에 따른 요청 수를 보여줍니다.- Response Code별 요청 수:
Buckets섹션에서Add를 클릭하고Split series를 선택합니다.Aggregation을Terms로 설정하고Field를response_code.keyword로 설정합니다.Order by는Term으로,Size는5로 설정합니다.Update버튼을 클릭하면, 각 응답 코드(200, 404, 401 등)별 요청 수를 나타내는 막대 차트가 생성됩니다. 이를 통해 어떤 유형의 응답이 가장 많은지 한눈에 파악할 수 있습니다.
- 요청 메서드(GET, POST)별 분포:
- 새로운 시각화를 만들거나 기존 시각화를 저장한 후 다시
Create visualization을 선택합니다. Pie차트를 선택하고web_access_logs-*인덱스 패턴을 사용합니다.Slice버킷을 추가하고Aggregation을Terms로,Field를method.keyword로 설정합니다.Update를 클릭하면,GET,POST,PUT등 HTTP 메서드별 요청 분포를 파이 차트로 볼 수 있습니다.
- 새로운 시각화를 만들거나 기존 시각화를 저장한 후 다시
- 왼쪽 메뉴에서
- 대시보드 생성 (Dashboard):
- 왼쪽 메뉴에서
Analytics->Dashboard로 이동한 후Create dashboard를 클릭합니다. Add an existing버튼을 클릭하여 방금 생성한 시각화들을 대시보드에 추가합니다.- 시각화들의 크기와 위치를 조정하여 하나의 통합된 모니터링 화면을 구성할 수 있습니다. 이를 통해 웹 서버의 전반적인 상태를 한눈에 파악할 수 있는 대시보드를 구축하게 됩니다.
- 왼쪽 메뉴에서
7. 컨테이너 종료
예제 실습을 마쳤다면, 터미널에서 다음 명령어를 사용하여 ELK 스택 컨테이너를 종료합니다.
docker compose down
docker compose down -v를 사용하면 Elasticsearch 데이터 볼륨까지 삭제되어 다음 실행 시 완전히 새로운 환경으로 시작할 수 있습니다.
이 간단한 예제를 통해 여러분은 Logstash로 로그를 수집하고 정제하며, Elasticsearch에 저장하고, Kibana로 시각화하는 엘라스틱 스택의 기본적인 흐름을 경험했습니다. 실제 운영 환경에서는 훨씬 더 복잡한 로그 형식과 더 많은 데이터를 처리하겠지만, 기본 원리는 동일합니다. 이제 이 강력한 도구를 활용하여 시스템의 문제를 해결하고 성능을 모니터링하는 방법을 알아봅시다.
엘라스틱 스택 기반의 Observability: 확장된 활용 방안
로그 분석의 중요성은 이미 충분히 강조했지만, 현대의 복잡한 분산 시스템 환경에서는 단순히 로그만으로는 시스템 전반의 건강 상태를 완전히 파악하기 어려운 경우가 많습니다. 여기서 '옵저버빌리티(Observability)'라는 개념이 등장하며, 엘라스틱 스택은 이 옵저버빌리티를 구현하는 데 핵심적인 역할을 수행합니다.
Observability(관측 가능성)란 무엇인가?
옵저버빌리티는 시스템의 외부 출력(로그, 메트릭, 트레이스)을 통해 시스템의 내부 상태를 얼마나 잘 추론할 수 있는지를 나타내는 척도입니다. 즉, "시스템에서 무슨 일이 일어나고 있는지"를 단순히 '모니터링(Monitoring)'하는 것을 넘어, "왜 그런 일이 일어났는지"까지 깊이 있게 이해하고 분석하는 능력을 의미합니다.
전통적인 모니터링이 '예상 가능한 실패'에 대응하는 것이라면, 옵저버빌리티는 '예상치 못한 실패'까지도 진단하고 해결하는 데 초점을 맞춥니다. 옵저버빌리티는 주로 세 가지 핵심 기둥(Three Pillars) 위에 구축됩니다.
- 로그 (Logs):
- 정의: 특정 시점에 발생한 이벤트를 기록한 불변의 시계열 데이터. "어떤 일이 일어났는지(What happened)".
- 역할: 문제 발생 시 상세한 컨텍스트와 원인 파악을 위한 구체적인 정보를 제공합니다. 오류 메시지, 스택 트레이스, 사용자 ID, 요청 파라미터 등이 포함됩니다.
- 엘라스틱 스택: Logstash와 Filebeat(경량 로그 수집기)를 통해 수집되고 Elasticsearch에 저장되며 Kibana로 시각화됩니다.
- 메트릭 (Metrics):
- 정의: 시간 경과에 따른 시스템의 측정 가능한 숫자 데이터. "얼마나 자주, 얼마나 많이(How often, How much)".
- 역할: 시스템 성능의 전반적인 추세와 상태를 파악하는 데 사용됩니다. CPU 사용률, 메모리 사용량, 네트워크 트래픽, 요청 처리량, 에러율 등이 대표적입니다. 로그와 달리 집계된 형태로 저장되어 시계열 분석에 최적화되어 있습니다.
- 엘라스틱 스택: Metricbeat(시스템 메트릭), Heartbeat(업타임 모니터링), APM(애플리케이션 메트릭)을 통해 수집되고 Elasticsearch에 저장되며 Kibana의 시각화 도구로 대시보드에서 추이를 모니터링합니다.
- 트레이스 (Traces):
- 정의: 분산 시스템 내에서 단일 요청의 시작부터 끝까지 전체 흐름을 추적하는 데이터. "어떻게 일어났는지(How it happened)".
- 역할: 여러 서비스에 걸쳐 복잡하게 처리되는 요청의 지연 시간, 병목 현상, 오류 지점 등을 시각적으로 파악하는 데 매우 효과적입니다. 마이크로서비스 아키텍처에서 특히 중요합니다.
- 엘라스틱 스택: Elastic APM(Application Performance Monitoring) 에이전트를 통해 수집되고 Elasticsearch에 저장되며 Kibana APM UI에서 서비스 맵, 스팬 트레이스 등을 시각화합니다.
이 세 가지 기둥은 서로 보완적인 관계를 가집니다. 메트릭으로 '무엇인가 잘못되었다'는 것을 감지하고, 트레이스로 '어느 서비스에서 문제가 발생했는지'를 파악하며, 로그로 '왜 그 문제가 발생했는지'에 대한 상세한 원인을 분석하는 것입니다.
엘라스틱 스택과 통합 Observability
엘라스틱 스택은 이러한 옵저버빌리티의 세 기둥을 모두 단일 플랫폼 내에서 지원하고 통합합니다. 즉, 하나의 ELK 스택으로 로그, 메트릭, 트레이스 데이터를 모두 수집, 저장, 분석, 시각화할 수 있습니다.
엘라스틱 스택이 제공하는 통합 Observability 기능:
- 통합 데이터 수집:
- Filebeat: 로그 파일 수집.
- Metricbeat: 시스템, 네트워크, 서비스 메트릭 수집.
- Auditbeat: 감사 로그 및 보안 이벤트 수집.
- Heartbeat: 서비스 업타임(가동 시간) 모니터링.
- Elastic APM 에이전트: 애플리케이션 성능 지표 및 트레이스 수집.
이러한 Beat 에이전트들은 경량이며 효율적으로 다양한 데이터를 수집하여 Logstash(필요시)를 거쳐 Elasticsearch로 전송합니다.
- 통합 데이터 저장 및 분석:
- 모든 로그, 메트릭, 트레이스 데이터는 Elasticsearch에 통합되어 저장됩니다. 이는 데이터 사일로(Silo) 현상을 방지하고, 모든 데이터를 상호 연관 지어 분석할 수 있는 기반을 마련합니다. 예를 들어, 특정 시간대에 CPU 사용량이 급증(메트릭)한 시점에 어떤 에러 로그(로그)가 대량으로 발생했고, 그 에러가 특정 서비스의 응답 시간 지연(트레이스)으로 이어졌는지 한눈에 파악할 수 있습니다.
- 통합 시각화 및 대시보드:
- Kibana는 로그, 메트릭, APM 트레이스를 위한 전용 UI와 대시보드를 제공하여 사용자가 이 모든 데이터를 하나의 인터페이스에서 탐색하고 시각화할 수 있도록 합니다.
- Observability 개요 페이지: Kibana의 Observability 섹션에서는 로그, 메트릭, APM 데이터를 하나의 통합된 화면에서 볼 수 있는 대시보드를 제공합니다. 시스템 전반의 상태를 빠르게 파악하고, 문제가 발생한 지점에서 드릴다운하여 상세 정보를 확인할 수 있습니다.
- APM UI: 서비스 맵을 통해 각 마이크로서비스 간의 관계와 성능을 시각적으로 보여주고, 개별 트랜잭션의 상세한 트레이스 정보를 분석하여 병목 지점을 정확히 찾아냅니다.
- Uptime 모니터링: Heartbeat로 수집된 데이터를 통해 서비스의 가용성(업타임)을 지속적으로 모니터링하고 다운타임을 시각화합니다.
- 강화된 보안 기능:
- 엘라스틱 스택은 SIEM(Security Information and Event Management) 기능을 포함하여 보안 로그를 수집, 분석, 시각화하고 위협을 탐지하는 데 활용될 수 있습니다. Auditbeat와 Filebeat를 통해 수집된 보안 로그는 Kibana Security UI에서 실시간으로 분석되어 잠재적인 공격 시도나 비정상적인 행동을 식별합니다.
결론: 엘라스틱 스택, 미래 지향적인 시스템 운영을 위한 핵심 선택
엘라스틱 스택 기반의 로그 분석을 포함한 엘라스틱 스택은 단순한 로그 관리 도구를 넘어, 현대적이고 복잡한 IT 시스템을 위한 통합 옵저버빌리티 플랫폼을 제공합니다. 로그, 메트릭, 트레이스를 유기적으로 결합하여 시스템의 전반적인 건강 상태를 깊이 있게 이해하고, 선제적으로 문제를 감지하며, 장애 발생 시 신속하게 원인을 파악하여 해결할 수 있는 강력한 능력을 부여합니다.
클라우드 환경, 마이크로서비스 아키텍처, 컨테이너 기술이 보편화된 오늘날, 시스템의 투명성을 확보하고 운영 효율성을 극대화하는 것은 그 어느 때보다 중요합니다. 엘라스틱 스택은 이러한 요구사항을 충족시키며, 비전공자부터 전문가까지 모든 IT 관계자가 시스템을 더 잘 이해하고 관리할 수 있도록 돕는 미래 지향적인 솔루션입니다.
지금 바로 엘라스틱 스택을 시작하여 여러분의 시스템이 들려주는 이야기를 경청하고, 더 안정적이고 효율적인 디지털 환경을 만들어나가시길 바랍니다.
'DEV' 카테고리의 다른 글
| [비전공자도 마스터] Big O 표기법 완벽 가이드: 알고리즘 성능 최적화와 효율성 분석 (0) | 2026.01.24 |
|---|---|
| 자바 성능 튜닝 완벽 가이드: 느린 코드를 고속화하는 비법 (초보부터 전문가까지) (0) | 2026.01.24 |
| JWT 인증 마스터 가이드: 현대 웹을 위한 토큰 기반 인증, 초보부터 개발자까지 완벽 이해 (0) | 2026.01.24 |
| 데이터베이스 샤딩: 대규모 데이터 처리의 한계를 넘어서는 확장성 해법 완벽 가이드 (0) | 2026.01.24 |
| 자바스크립트 비동기 완벽 가이드: Callback, Promise, Async/Await로 마스터하기 (0) | 2026.01.24 |
- Total
- Today
- Yesterday
- 로드밸런싱
- 코드생성AI
- spring프레임워크
- AI
- 배민
- 해외
- llm최적화
- LLM
- AI기술
- Oracle
- 개발자가이드
- Rag
- 마이크로서비스
- 자바AI개발
- 업무자동화
- 미래ai
- springai
- 데이터베이스
- ElasticSearch
- 시스템아키텍처
- 프롬프트엔지니어링
- Java
- 펄
- 서비스안정화
- 성능최적화
- 개발생산성
- 웹개발
- 직구
- 인공지능
- 오픈소스DB
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
