이번글에서는 세미나 프로젝트에서 생긴 로그를 분석하고 시각화해보기 위한 과정을 담아보려고합니다.

https://www.elastic.co/guide/en/cloud/current/ec-getting-started-search-use-cases-beats-logstash.html

로그 수집을 위한 위의 그림과 같습니다.

Tomcat에서 로그 생성 -> FileBeat -> logstash -> ElasticSearch 로 흐르는 로그 수집기를 만들려고합니다.

 

먼저 이번에 로그수집기를 만들어보며 알게된 FileBeat, logstash의 기술스택에 대해 정리해보았습니다.

1. Beat에 대하여 - FileBeat과 그외의 Beat들

Filebeat은 경량 로그 데이터 수집기로, 시스템 자원을 적게 사용하여 동작합니다. 이는 서버 리소스를 절약하면서도 대량의 로그 데이터를 효율적으로 수집할 수 있음을 의미합니다. 이러한 이점을 통해 시스템의 성능에 부담을 주지 않아, 안전하게 수집할 수 있게 합니다. 또한, Filebeat에서는 자동으로 우리가 쌓고있는 로그데이터를 주기적으로 스캔하여 쌓이고 있는 데이터를 알아서 가져오는 역할을 합니다.

 

Beat 같은 경우 제가 사용할 FileBeat 외에도 여러 데이터들을 수집할 수 있도록 지원하는 Beat들이 있습니다.

각 Beat들의 종류에 대해 정리해보면 Filebeat, Packetbeat, Winlogbeat, Metricbeat, Heartbeat, Auditbeat, Functionbeat 로  총 7가지의 beat가 존재합니다.

 

각각 beat에 대한 역할과 용도에 대해 정리해보았습니다.

  • Filebeat:
    • 역할: 로그 파일을 수집하여 중앙 집중식 위치로 전송하는 경량 로그 데이터 수집기입니다.
    • 용도: 서버 로그, 애플리케이션 로그, 시스템 로그 등을 수집하여 Elasticsearch나 Logstash로 전송합니다.
    • 예를 들어, Apache 또는 Nginx 웹 서버의 액세스 로그를 Filebeat을 사용하여 수집할 수 있습니다.
  • Packetbeat:
    • 역할: 네트워크 패킷을 실시간으로 분석하고 응용 프로그램 간 통신 패턴을 이해할 수 있는 경량 네트워크 패킷 분석기입니다.
    • 용도: 네트워크 트래픽 분석, 응용 프로그램 간 통신 및 성능 모니터링에 사용됩니다.
    • 예를 들어, 웹 서버와 클라이언트 간의 HTTP 통신 패턴, 데이터베이스 쿼리 및 응답 시간, DNS 요청과 응답 등 네트워크 통신을 실시간으로 분석할 수 있습니다.
  • Winlogbeat:
    • 역할: Windows 이벤트 로그 데이터를 수집하여 중앙 집중식 위치로 전송하는 경량 Windows 로그 데이터 수집기입니다.
    • 용도: Windows 기반 시스템의 이벤트 로그 모니터링 및 분석에 사용됩니다.
    • 예를 들어, Windows 서버 또는 클라이언트의 이벤트 로그를 수집하여 보안 이벤트, 시스템 오류, 사용자 로그인 정보 등을 중앙 집중식 위치에 전송합니다. 보안 모니터링이나 감사 추적을 위해 사용될 수 있습니다.
  • Metricbeat:
    • 역할: 시스템 및 서비스의 성능 메트릭 데이터를 수집하여 중앙 집중식 위치로 전송하는 경량 메트릭 데이터 수집기입니다.
    • 용도: 서버 리소스 사용량, CPU 사용률, 메모리 사용량, 네트워크 트래픽 등의 성능 데이터를 수집하여 분석 및 시각화에 사용됩니다.
    • 예를 들어, 서버의 CPU 사용률, 메모리 사용량, 디스크 공간, 네트워크 트래픽 등의 성능 데이터를 수집하여 중앙 집중식 위치로 전송합니다. 이 정보를 기반으로 서버 성능을 모니터링하고 확장성을 평가할 수 있습니다.
  • Heartbeat:
    • 역할: 서버, 서비스 또는 인프라 구성 요소의 가용성을 모니터링하고 실시간으로 확인하는 경량 가용성 모니터링 도구입니다.
    • 용도: 웹사이트, 서비스, 서버의 가용성을 지속적으로 확인하고 이상 징후를 감지하여 알림을 생성합니다.
    • 예를 들어, 웹 사이트, API 엔드포인트, 서버 또는 클라우드 서비스의 가용성을 주기적으로 체크하여 실시간으로 확인합니다. 이를 통해 서비스 가용성에 대한 경보를 설정하거나 장애 발생 여부를 신속하게 파악할 수 있습니다.
  • Auditbeat:
    • 역할: 리눅스 시스템에서 감사 및 보안 이벤트를 수집하여 중앙 집중식 위치로 전송하는 경량 감사 데이터 수집기입니다.
    • 용도: 리눅스 시스템에서 파일 시스템, 사용자 활동, 권한 변경 등의 감사 이벤트를 수집하여 분석 및 감사에 활용됩니다.
    • 예를 들어, 리눅스 시스템에서 중요한 파일 변경, 권한 수정, 사용자 로그인 이벤트 등의 감사 이벤트를 수집하여 중앙 집중식 위치에 전송합니다. 보안 감사, 규정 준수, 이상 징후 탐지 등에 사용됩니다.
  • Functionbeat:
    • 역할: 클라우드 서비스에서 이벤트 기반 서버리스 함수 (예: AWS Lambda, Google Cloud Functions) 로그 및 이벤트 데이터를 수집하는 경량 데이터 수집기입니다.
    • 용도: 서버리스 환경에서 함수 실행 로그 및 이벤트 데이터를 수집하여 분석 및 모니터링에 사용됩니다.
    • 예를 들어, AWS Lambda, Google Cloud Functions 등의 서버리스 환경에서 함수 실행 로그, 이벤트 등을 수집하여 중앙 집중식 위치로 전송합니다. 서버리스 함수의 실행 상태를 모니터링하고 성능 향상을 위한 정보를 수집할 수 있습니다.

제가 사용할 것은 Apache Tomcat의 로그를 기반으로 한 로그를 분석할것이므로 FileBeat를 사용합니다.

 

추가적으로 Beat에 대해 알아보고싶으시다면, 아래의 공식문서가 있습니다.

https://www.elastic.co/guide/en/beats/libbeat/current/beats-reference.html

 

What are Beats? | Beats Platform Reference [8.10] | Elastic

Beats are open source data shippers that you install as agents on your servers to send operational data to Elasticsearch. Elastic provides Beats for capturing: Beats can send data directly to Elasticsearch or via Logstash, where you can further process and

www.elastic.co

 

2. Logstash 에 대하여

Logstash는 Filebeat에서 수집된 로그 데이터나 다양한 소스에서 받은 데이터를 구조화된 형태로 변환하는 역할을 합니다.  이를 통해 데이터의 일관성을 유지하고, 필요한 정보를 추출하며, 데이터를 필터링하고 변환하는 작업을 수행할 수 있습니다. 예로 들면, JSON 형식으로 파싱하거나 필요한 필드를 추출하는 것과 같은 가공작업을 Logstash에서 손쉽게 작업할 수 있도록 도와줍니다.

 

https://www.elastic.co/kr/blog/a-practical-introduction-to-logstash

 

Logstash는 크게 3가지의 구조로 이루어져있습니다.

입력(Input), 필터(Filter), 출력(Output) 의 형태로 이루어져 있고, 

입력Input) 은 데이터의 수집을 담당합니다. Input에 사용되는 플러그인을 살펴보면,  file, stdin, beats, tcp, udp, jdbc 와 같은 필터들이 있습니다.

필터(Filter)는 가공, 저장을 담당합니다. filter에 사용되는 플러그인을 살펴보면, grok Filter, geoip Filter, useragent Filter, mutate Filter, date Filter와 같은 필터들이 있습니다.

출력(Output)은 데이터의 출력을 담당합니다. Output에 사용되는 플러그인을 살펴보면, elasticsearch, stdout, file, tcp, udp, kafka와 같은 필터들이 있습니다.

 

Logstash의 구조에 대하여 좀 더 정리해보았습니다.

1. Input Plugins (입력 플러그인):

  • 역할: Logstash에 데이터를 가져오는 역할을 합니다.
  • Input Plugins
    • file: 로그 파일로부터 데이터를 수집합니다.
    • stdin: 표준 입력(stdin)에서 데이터를 읽어옵니다.
    • beats: Filebeat 등 Beats로부터 데이터를 수집합니다.
    • tcp, udp: TCP 또는 UDP 프로토콜로부터 데이터를 수집합니다.
    • jdbc: JDBC 데이터베이스에서 데이터를 가져옵니다.

2. Filter Plugins (필터 플러그인):

  • 역할: 입력 데이터를 가공하고, 변환하며, 필요한 정보를 추출합니다.
  • Filter Plugins
    • grok: 정규 표현식을 사용하여 로그 데이터를 구문 분석합니다.
    • mutate: 필드를 추가, 제거, 수정하거나 데이터 타입을 변환합니다.
    • date: 날짜 형식의 데이터를 파싱하고, 타임스탬프를 생성합니다.
    • json: JSON 형식의 데이터를 파싱합니다.
    • geoip: IP 주소를 기반으로 지리적 위치 정보를 추가합니다.

3. Output Plugins (출력 플러그인):

  • 역할: 가공된 데이터를 최종 저장소에 전송합니다.
  • 예시:
    • elasticsearch: Elasticsearch로 데이터를 전송하여 색인합니다.
    • stdout: 표준 출력(stdout)으로 데이터를 출력합니다.
    • file: 로컬 파일 시스템에 데이터를 저장합니다.
    • tcp, udp: TCP 또는 UDP 프로토콜로 데이터를 전송합니다.
    • kafka: Apache Kafka로 데이터를 전송합니다.

Logstash에 대한 더 자세한 정보는 아래의 공식문서에서 확인할 수 있습니다.

https://www.elastic.co/guide/en/logstash/current/introduction.html

 

Logstash Introduction | Logstash Reference [8.10] | Elastic

Logstash Introductionedit Logstash is an open source data collection engine with real-time pipelining capabilities. Logstash can dynamically unify data from disparate sources and normalize the data into destinations of your choice. Cleanse and democratize

www.elastic.co

 

 

이로써 ElasticSearch로 로그를 전송하기 위해 사용하는 Beats 와 logstash 에 대해 알아보았습니다.

기술에 대해 알아볼수록, FileBeats와 Logstash의 기능이 중복된다고 생각이 들었습니다. FileBeats를 거치지 않고, Logstash의 input에 file plugins를 사용해서 직접 로그 데이터를 입력하는것 또한 가능한데 굳이 FileBeats를 사용하는 이유에 의문이 들었습니다. 

이유는, Filebeat는 호스트 서버에서 로그를 수집하고 발송하는 용도로 개발되어 성능에 대해 더 최적화되어있고, 낮은 리소스만 필요로 해서 에이전트로 실행하는데 사용하기 좋습니다. 

로그의 양이 적다면 문제가 없겠지만, 로그가 약 1억개 이상인 상황에서 단순히 logstash로만 처리하는것에는 한계가 있을 것입니다. 그렇기에, FileBeat와 Logstash의 역할을 분리해서 서버의 부담을 줄여줍니다.

 

일반적으로 위의 이유로, Filebeat는 Logstash 인스턴스가 동작하는 가상머신으로부터 분리된 머신에서 동작하지만, 이번글에서는 같은 머신에서 테스트를 진행합니다.

3. Spring Boot에서 발생하는 로그 가져오기

우리가 분석할 로그를 가져오는것이 우선입니다. Apache에는 크게 Common Log 형식과 Combined Log 형식이 존재하는데 이번 글에서는 Combined Log를 사용합니다. Combined Log에는 좀 더 많은 데이터를 혼합할 수 있어 Combined Log를 사용합니다.

 

Server에서 발생하는 로그들을 파일로 저장하기 위해 설정하겠습니다.

1. application.yml

server:
  tomcat:
    accesslog:
      enabled: true
      directory: [로그파일 다운로드 위치를 설정합니다.]
      prefix: apachelog
      suffix: .log
      pattern: "%h %l %u [%t] \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\""

위의 설정파일을 통해 로그파일을 다운받을 수 있습니다.

서버를 시작한다음에 API를 호출할경우 아래와 같이 로그내역이 나옵니다.

 

위의 Pattern에 대해 더 정리해보면,

  • %h: 클라이언트 IP 주소
    • 예시: 192.168.1.1
  • %l: 클라이언트 이름 또는 -, 
    • 예시: -
  • %u: 사용자 이름 또는 - 
    • 예시: helloworld
  • %t: 로그의 타임스탬프
    • 예시: [06/Nov/2023:12:34:56 +0000]
  • %r: HTTP 요청 메소드, URL, 프로토콜
    • 예제: "GET /example HTTP/1.1"
  • %s: 상태 코드
    • 예제: 200
  • %b: 응답 바이트 수
    • 예제: 1024
  • %{Referer}i: Referer 헤더 값
  • %{User-Agent}i: User-Agent 헤더 값
    • 예제: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.4567.89 Safari/537.36"

apachelog.2023-11-06.log

127.0.0.1 - - [[06/Nov/2023:15:12:56 +0900]] "GET /api/v1/seminar/list?pageNo=1&limit=10 HTTP/1.1" 200 3249 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:13:01 +0900]] "GET /api/v1/seminar/list?pageNo=1&limit=10 HTTP/1.1" 200 3249 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:14:33 +0900]] "GET /api/v1/seminar/list?pageNo=1&limit=10 HTTP/1.1" 200 3249 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:14:33 +0900]] "GET /api/v1/seminar/list?pageNo=1&limit=10 HTTP/1.1" 200 3249 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:14:34 +0900]] "GET /api/v1/seminar/list?pageNo=1&limit=10 HTTP/1.1" 200 3249 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:14:34 +0900]] "GET /api/v1/seminar/list?pageNo=1&limit=10 HTTP/1.1" 200 3249 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:15:00 +0900]] "POST /api/v1/member HTTP/1.1" 404 113 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:15:07 +0900]] "POST /api/v1/seminar HTTP/1.1" 404 114 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:15:09 +0900]] "POST /api/v1/member HTTP/1.1" 404 113 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:15:12 +0900]] "POST /api/v1/member/ HTTP/1.1" 404 114 "-" "PostmanRuntime/7.34.0"
127.0.0.1 - - [[06/Nov/2023:15:15:17 +0900]] "POST /api/v1/member HTTP/1.1" 404 113 "-" "PostmanRuntime/7.34.0"

 

이로써 우리가 사용할 로그를 구할 수 있습니다.

하지만, 테스트하기에 데이터가 부족하니 아래의 사이트에서 사용할 샘플 로그데이터를 찾아서 사용하시는것을 추천드립니다. 

https://gist.github.com/rm-hull/bd60aed44024e9986e3c

 

Publicly available access.log datasets

Publicly available access.log datasets. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

4. FileBeats 설정

이제 FileBeat를 실행하여 3번과정에서 생성한 로그파일을 Logstash로 전송하는 설정을 진행하겠습니다.

filebeat.yml 

# ============================== Filebeat inputs ===============================

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input-specific configurations.

# filestream is an input for collecting log messages from files.
- type: filestream

  # Unique ID among all inputs, an ID is required.
  id: my-filestream-id

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /home/ec2-user/fb-81/apachelog.2023-11-06.log
    #- c:\programdata\elasticsearch\logs\*
    
    

# ============================== Filebeat modules ==============================

filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d\*.yml  //이 부분은 제가 임의수정했습니다.

  # Set to true to enable config reloading
  reload.enabled: false

  # Period on which files under path should be checked for changes
  #reload.period: 10s
  
  
# ================================== Outputs ===================================
# Configure what output to use when sending the data collected by the beat.
# ------------------------------ Logstash Output -------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]

  # Certificate for SSL client authentication
  #ssl.certificate: "/etc/pki/client/cert.pem"

  # Client Certificate Key
  #ssl.key: "/etc/pki/client/cert.key"

 

1. 위와 같이 filebeat의 input을 설정합니다. 

여기서 가장 중요한점은 3번 과정에서 생성한 로그파일의 경로를 filebeat.inputs.paths 에 넣어야한다는 점입니다.

저는 apachelog.2023-11-06.log로 직접적으로 넣었지만 아래의 주석처리와 같이 /* 를 통해 로그파일을 한곳에 몰아두고서 하는것이 일괄적으로 처리하여 사용하는것이 일반적일 것 입니다.

2. Filebeat modules 설정합니다.

위의 설정을 통해 filebeat 설정 파일의 경로를 설정할 수 있고, reload.enabled:true로 수정할경우 설정파일이 수정될경우 자동으로 filebeat이 재실행하도록 할 수 있습니다.

3. Filebeats Output을 Logstash로 설정합니다. logstash의 위치는 같은 머신에서 작동하고 있으므로 "localhost:5044"로 설정합니다. logstash와 연결하기 위해 5번 과정에서 logstash의 설정에서 확인할 수 있습니다. 추가로, 여기서 Logstash로 보내지 않고, 만약 Log 를 필터링하지 않아도 된다면 바로 ElasticSearch로 보내는 설정도 있습니다. 저희는 로그 데이터 필터링을 위해 Logstash를 거치게 합니다. 

 

추가적으로, FileBeat는 로그파일의 마지막 데이터 삽입 위치를 저장하고있기에 파일이 주어지고 삽입하면서, 어디까지 데이터를 전송했는지 저장하고 있습니다. 해당 데이터의 정보는 filebeat/data directory에 존재합니다. 그러므로, 만약 데이터를 넣으시고 처음부터 다시 넣어보고 싶으시다면 filebeat/data directory를 삭제하시고 실행하시면 됩니다.

 

 

5. Logstash 설정

Logstash에서는 logstash.yml 설정파일을 건드리지 않고, 사용할 파일을 직접 logstash를 실행할떄 선언하여 실행합니다.

아래의 명령어와 같이 실행할 수 있습니다.

bin/logstash -f logstash.conf

 

 

2번 과정에서 설명했듯이 logstash는 Input, Filter, Output의 구조로 각각 사용할 플러그인을 활용합니다.

 

logstash.conf

input {
	beats {
		port => 5044
	}
}
filter {
    grok{
            match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
	geoip{
		source => "[source][address]"
   		target => "geoip"
	}
	useragent {
		source => "[user_agent][original]"
		target => "useragent"
	}
	mutate{
		convert => {
			"[response][body][bytes]" => "integer"
		}
	}
	date {
		match => ["[timestamp]", "dd/MMM/yyyy:HH:mm:ss Z"]
		target => "logdate"
	}
	mutate{
		remove_field => ["[timestamp]", "[@version]","[user_agent]", "[host]", "[agent]", "[cloud]", "[input]", "[log]", "[source]", "[event]","[url]"]
	}
	
}

output {
	stdout{ 
		codec => "rubydebug"
#		codec => "dots"
	}
	elasticsearch{
		hosts => ["127.0.0.1:9200"]
		index => "apachelog-%{+YYYY.MM.dd}"
	}
}

 

1. Input 섹션 : Logstash의 입력 부분을 정의합니다.

  • Beats 플러그인을 사용하여 5044 포트에서 데이터를 수신합니다.

2. Filter 섹션: 데이터를 처리하는 부분입니다. 여러 필터를 적용하여 데이터를 가공합니다.

  • grok: COMBINEDAPACHELOG 패턴에 맞게 데이터를 추출합니다.
  • geoip: IP 주소를 기반으로 지리적 위치 정보를 추가합니다.
  • useragent: User-Agent 문자열을 해석하여 브라우저 및 운영체제 정보를 추출합니다.
  • mutate: 필드를 변환하거나 제거합니다. 여기서는 response.body.bytes 필드를 정수로 변환하고, 특정 필드들을 제거합니다.
  • date: 날짜를 파싱하여 logdate 필드에 저장합니다.

 

grok 패턴 Github입니다.

https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

 

grok, geoip, useragent filter에 대한 공식 문서는 아래에서 확인할 수 있습니다.

https://www.elastic.co/guide/en/logstash/current/introduction.html

 

Logstash Introduction | Logstash Reference [8.10] | Elastic

Logstash Introductionedit Logstash is an open source data collection engine with real-time pipelining capabilities. Logstash can dynamically unify data from disparate sources and normalize the data into destinations of your choice. Cleanse and democratize

www.elastic.co

 

3.Output 섹션: 처리된 데이터를 출력합니다.

  • stdout: 표준 출력으로 데이터를 출력하며, rubydebug 코덱을 사용하여 읽기 쉬운 형식으로 출력합니다.
  • elasticsearch: Elasticsearch에 데이터를 전송합니다. 로그를 apachelog-년.월.일 형식의 인덱스에 저장하며, 로컬 호스트의 9200 포트로 연결합니다. 

이렇게 구성된 파이프라인은 Beats에서 데이터를 수집하고, Apache 로그 형식의 메시지를 파싱하여 필드로 추출하고, 지리적 위치 정보(geoip), User-Agent 정보를 추가하여 Elasticsearch에 저장하고, 표준 출력으로 출력합니다.

 

6. ElasticSearch 데이터 적재하고 Index 모델링하기

이제 filebeat에서 실제로 로그를 넣으면, filebeat -> logstash -> elasticsearch 로 진행되는 로그 파이프라인으로 ElasticSearch로 데이터가 온전하게 들어가는지 확인해봐야합니다.

 

아래와 같이 filebeat 명령어로 filebeat을 실행하고, 

./filebeat

 

아래의 명령어를 통해 인덱스가 잘 생성되었는지 확인합니다.

GET _cat/indices

인덱스가 잘 생성된 것을 확인할 수 있습니다.

 

저희가 현재는 apachelog-2023.11.06 이라는 특정날짜에 대해서만 로그를 관리하지만, 다른날짜 로그가 들어와도 같은 매핑을 사용하기 위해서는 Index_Template이라는것을 활용합니다.

 

apachelog-* 형식에 사용할 인덱스 템플릿입니다. 이제부터 apachelog- 로 시작하는 인덱스에 모두 아래의 mapping과 setting이 적용됩니다.

 

인덱스 템플릿 apachelog  생성 : _index_template/apachelog 

PUT _index_template/apachelog
{
  "index_patterns": ["apachelog-*"],
  "priority": 1,
  "template": {
    "settings": {
      "number_of_shards": 1
    },
"mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "geoip": {
          "properties": {
            "geo": {
              "properties": {
                "city_name": {
                  "type": "keyword"
                },
                "continent_code": {
                  "type": "keyword"
                },
                "country_iso_code": {
                  "type": "keyword"
                },
                "country_name": {
                  "type": "keyword"
                },
                "location": {
                  "type": "geo_point"
                },
                "timezone": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                },
                "postal_code": {
                  "type": "keyword"
                },
                "region_iso_code": {
                  "type": "keyword"
                },
                "region_name": {
                  "type": "keyword"
                }
              }
            },
            "ip": {
              "type": "ip"
            }
          }
        },
        "http": {
          "properties": {
            "request": {
              "properties": {
                "method": {
                  "type": "keyword"
                }
              }
            },
            "response": {
              "properties": {
                "body": {
                  "properties": {
                    "bytes": {
                      "type": "long"
                    }
                  }
                },
                "status_code": {
                  "type": "long"
                }
              }
            },
            "version": {
              "type": "keyword"
            }
          }
        },
        "logdate": {
          "type": "date"
        },
        "message": {
          "type": "text"
        },
        "useragent": {
          "properties": {
            "device": {
              "properties": {
                "name": {
                  "type": "keyword"
                }
              }
            },
            "name": {
              "type": "keyword"
            },
            "os": {
              "properties": {
                "full": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                },
                "name": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                },
                "version": {
                  "type": "keyword"
                }
              }
            },
            "version": {
              "type": "keyword"
            }
          }
        }
      }
    },
    "aliases": {
      "mydata": { }
    }
  },
  "_meta": {
    "description": "my custom"
  }
}

 

잘 생성되었는지 확인하고싶다면, 아래의 코드로 확인할 수 있습니다.

GET _index_template/apachelog

 

이전에 생성했었던 apachelog-2023.11.06 을 새로 apachelog에 매핑해주기 위해 삭제한뒤 다시 데이터를 넣어줍니다.

이제 저희가 사용할 데이터를 저희가 원하는 Index Mapping을 완료하고 데이터를 적재했습니다. 

 

7. Kibana에서 주어진 로그 데이터 시각화

이제 Kibana의 기능을 통해 ElasticSearch에 적재된 로그데이터를 시각화하여 손쉽게 구분할 수 있도록 해보겠습니다.

 

7-1. Data View를 생성합니다.

 

Index Pattern 을 apachelogs-* 를 찾아서 매칭시켜줍니다.

Timestamp Field 같은 경우, 키바나는 기본적으로 시간을 기준으로 데이터를 보여주므로  logdate를 통해 시간을 설정해줍니다.

 

이제 아래와 같이 apachelogs-* 라는 Data View가 생성된 것을 확인할 수 있습니다.

 

이제 데이터를 보기 위한 Dashboards를 생성합니다. 이제 여기에 다양한 Panel들을 추가해서 데이터를 시각화하여 편하게 봐보는 설정을 추가합니다.

 

 

Panel을 추가할것인데 아래의 공식문서에 많은 정보가 있습니다.

https://www.elastic.co/guide/en/kibana/current/create-a-dashboard-of-panels-with-web-server-data.html

 

Create your first dashboard | Kibana Guide [8.10] | Elastic

Create your first dashboardedit Learn the most common ways to create a dashboard from your own data. The tutorial will use sample data from the perspective of an analyst looking at website logs, but this type of dashboard works on any type of data. When yo

www.elastic.co

 

1. Metric Panel에 일정 기간동안 사이트에 접속했던 고객의 수를 손쉽게 구하기 위해 CleintIP의 Unique Count를 구합니다. 

 

2. 사용자들이 접속해서 사용한 Bytes량의 중위값들의 퍼센트율을 확인해보겠습니다.

Pie Chart에서 Metric에 bytes를 선택하고, Slice by bytes를 선택하여 아래와 같이 선택합니다.

 

3. 나라별로 접속한 비율을 확인하고 싶어 Pie Chart 형태로 확인해보겠습니다.

아래와 같이 손쉽게 확인할 수 있습니다.

 

4. 각 시간대별로 404, 200 번대와 같은 HTTP의 응답코드가 궁금합니다.

그렇기에 아래와 같이 조회합니다.

 

5. 이번에는 접속자의 위치와 국가별 접속에 대해 그래프로 시각화시켜보겼습니다.

아래의 kibana Maps 를 참고하여 진행하시기 바랍니다.

https://www.elastic.co/guide/en/kibana/current/maps-getting-started.html

 

Build a map to compare metrics by country or region | Kibana Guide [8.10] | Elastic

Build a map to compare metrics by country or regionedit If you are new to Maps, this tutorial is a good place to start. It guides you through the common steps for working with your location data. You will learn to: Create a map with multiple layers and dat

www.elastic.co

5-1. Add Panels에서 Maps를 선택합니다. 그리고 Add Layer에서 Clusters ( Group documents into grids and hexagons) 를 추가합니다.

5-2.이번에는 국가별 접속을 추가해보겠습니다. Choropleth ( Shade areas to compare statisitcs across boundaries. )

 

이제 위의 모든 데이터들을 하나의 대쉬보드에 담습니다.

이로써 우리가 조회하고싶은 로그데이터를 Kibana에서 시각화 작업을 통해 직관적으로 알 수 있습니다. 

 

마무리

이로써 로그데이터 수집을 하는 파이프라인을 만들고 해당 데이터를 Kibana를 통해 시각화하는 과정까지 진행해보았습니다. 이러한 로그 데이터를 기반으로 현재 서비스의 API 별 호출 확인, 현재 서비스에서 무슨 시간대에 가장 많은 404 에러가 났는지, 어떤 시간대에 어떤 나라가 많이 접속했는지와 같은 정보들을 확인하여 이후 서비스의 안전성을 올리기 위한 작업을 하는데 큰 도움이 될 것 같습니다.

 

https://www.elastic.co/guide/index.html

 

Starting with the Elasticsearch Platform and its Solutions | Elastic

 

www.elastic.co

 

 

logstash가 아닌 Vector가 속도가 훨씬 더 효율적. CPU는 절반, Memory는 매우 많이 개선.

대규모 시스템 운영에 대한 노하우가 담겨있는 유튜브

https://www.youtube.com/watch?v=_SJYU4lHa28

 

+ Recent posts