Logstash란?

이민석's avatar
May 10, 2025
Logstash란?

A.1. Logstash란 무엇인가?

Logstash는 실시간 데이터 수집 파이프라인으로
Source*의 Event*를 수집 및 처리하여 Dest*로 전달하는 역할을 합니다.

  • Source (N) → Pipeline (1) → Destination (1)

💡

₩[용어정의*] Source(출발지), Event(데이터), Dest(도착지)

따라서 Pipeline은 크게 3가지 구성을 가지고 있습니다.
(Codecs도 존재하지만 필수적인 구성이 아니라 판단하여 제외하였음)

Conf

Description

Example

Ref

Input

Source에 대한 정의

file,syslog,redis,kafka,kinesis, +

Plugins

Filter

Event 처리에 대한 정의

grok, mutate, drop, clone, geoip, +

Plugins

Output

Output에 대한 정의

es, file, graphite, statsd, +

Plugins

A.2. Logstash 실습하기

Logstash Pipeline을 테스트하고 싶은 것이므로 현실적인 타협*을 하려고 합니다.

💡

[현실적인 타협*] 1. 별도의 컨테이너, 클러스터, VM 사용 안함 2. 무조건 file (input, output)만 사용함 3. 가능한 간단한 실습 구조를 진행할 것 4. 패키지 매니저 등을 적극 활용 (brew, choco)

  1. Logstash 설치하기

    brew install logstash   # MacOS   Package Manager
    choco install logstash  # Windows Package Manager
  1. Logstash 설치 확인하기

    logstash --version
    which logstash

    logstash 9.0.1
    /opt/homebrew/bin/logstash
  2. 작업용 폴더 만들기

    mkdir -p ~/logstash-sample
    cd ~/logstash-sample
    pwd

    /Users/username/logstash-sample
  1. 로그 생성기 작업

    cd ~/logstash-sample
    
    cat << 'EOF' > input.sh
    #!/bin/bash
    
    touch input.log
    
    while true; do
      echo "$(date '+%F %T')" >> input.log
      tail -1 input.log
      sleep 1
    done
    EOF
  2. 로그 생성기 사용법(백그라운드, 데몬용)

    1. 실행 : nohup ./input.sh > input.nohup 2>&1 & echo $! > input.pid

    2. 로그(intput.log) : tail -f ./input.log

    3. 출력(stdout) : tail -f ./nohup.out

    4. 프로세스 확인 : ps -p $(cat input.pid)

    5. 프로세스 종료 : kill -9 $(cat input.pid)

  3. Logstash Configuration 파일 생성하기

    cd ~/logstash-sample
    
    cat << 'EOF' > logstash.conf
    input {
      file {
        path => "%%WORK_DIR%%/input.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"
      }
    }
    
    output {
      file {
        path => "%%WORK_DIR%%/output.log"
      }
    }
    EOF
    
    sed -i '' "s|%%WORK_DIR%%|$(pwd)|g" logstash.conf
    # 혹은 # sed -i "s|%%WORK_DIR%%|$(pwd)|g" logstash.conf
  1. Logstash 실행하기(백그라운드, 데몬)

    1. 실행 : nohup logstash -f "$(pwd)/logstash.conf" > logstash.nohup 2>&1 & echo $! > logstash.pid

    2. 로그(intput.log) : tail -f ./outupt.log

    3. 출력(stdout) : tail -f ./logstash.nohup

    4. 프로세스 확인 : ps -p $(cat logstash.pid)

    5. 프로세스 종료 : kill -9 $(cat logstash.pid)

  2. 실습 파일 전부 정리하기

    cd ~/logstash-sample
    
    kill -9 $(cat input.pid)
    kill -9 $(cat logstash.pid)
    
    rm input.pid
    rm input.nohup
    rm input.log
    
    rm logstash.pid
    rm logstash.nohup
    rm output.log

A.3. Logstash 모니터링하기

Logstash를 켰는데 이 친구를 관측하고 싶은데 어떻게 해야할까요?
Logstash는 JVM 기반이므로 JMX Exporter를 사용하면 매트릭 출력이 가능합니다.

A.2. 1 ~ 8까지 진행하면, 2개 파일이 남아있을건데, 여기서 시작하겠습니다.

cd ~/logstash-sample
ls -l
-rwxr-xr-x@ 1 usernmae  staff  119 May 10 13:57 input.sh
-rw-r--r--@ 1 username  staff  231 May 10 14:14 logstash.conf

  1. 로그생성기 실행 : nohup ./input.sh > input.nohup 2>&1 & echo $! > input.pid

  2. JMX Exporeter Jar 다운로드
    (신뢰하지말것, 시간이 지나면 이 구문이 실패할 수 있으니, 지정 경로에 jar파일을 꼭 따로 넣으시오)

    mkdir -p ~/logstash-sample/jmx-exporter
    cd ~/logstash-sample/jmx-exporter
    
    curl -L -o jmx_exporter-1.2.0.jar \
    https://github.com/prometheus/jmx_exporter/releases/download/1.2.0/jmx_prometheus_javaagent-1.2.0.jar
    
    pwd
    ls -l

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
    100 8721k  100 8721k    0     0  7656k      0  0:00:01  0:00:01 --:--:-- 8593k
    
    -rw-r--r--@ 1 username  staff  8931326 May 10 15:16 jmx_exporter-1.2.0.jar
    -rw-r--r--@ 1 username  staff      224 May 10 15:08 jmx_exporter.conf
  3. 로그 생성기 사용법(백그라운드, 데몬용) : A.2. 참고

    1. 실행 : nohup ./input.sh > input.nohup 2>&1 & echo $! > input.pid

    2. 로그(intput.log) : tail -f ./input.log

    3. 출력(stdout) : tail -f ./input.nohup

    4. 프로세스 확인 : ps -p $(cat input.pid)

    5. 프로세스 종료 : kill -9 $(cat input.pid)

  4. JMX Exporeter Configuration 생성하기

    cd ~/logstash-sample/jmx-exporter
    
    cat << 'EOF' > jmx_exporter.conf
    startDelaySeconds: 0
    scrapeIntervalSeconds: 60
    jmxMetrics:
      - pattern: '.*'
    EOF
  5. JMX + Logstash 사용법(백그라운드, 데몬)

    1. 실행

      cd ~/logstash-sample
      
      JMX_PORT=9404
      JMX_JAR=$(pwd)/jmx-exporter/jmx_exporter-1.2.0.jar
      JMX_CONF=$(pwd)/jmx-exporter/jmx_exporter.conf
      LS_CONF=$(pwd)/logstash.conf
      
      export LS_JAVA_OPTS="-javaagent:$JMX_JAR=$JMX_PORT:$JMX_CONF"
      nohup logstash -f $LS_CONF > logstash.nohup 2>&1 & echo $! > logstash.pid
    2. 로그(intput.log) : tail -f ./outupt.log

    3. 출력(stdout) : tail -f ./logstash.nohup

    4. 프로세스 확인 : ps -p $(cat logstash.pid)

    5. 프로세스 종료 : kill -9 $(cat logstash.pid)

  6. 테스트하기

    # Logstash API Endpoint
    curl localhost:9600
    
    # Logstash Metric Endpoint
    curl localhost:9404/metrics  

매트릭은 노출되고 있지만 기록되지 않기 때문에 Prometheus를 활용합니다.

💡

brew services start prometheus를 사용하면 Configuration 덮어씌우기나 일부 자동화가 복잡해져서 통일성 측면에서 모두 nohup을 활용했습니다.

  1. Prometheus 설치하기

    brew install prometheus
  2. Prometheus 설치확인하기

    premetheus --version

    prometheus, version 3.3.1 (branch: non-git, revision: non-git)
  3. Prometheus Configuration 설정하기

    mkdir -p ~/logstash-sample/prometheus
    cd ~/logstash-sample/prometheus
    
    cat << 'EOF' > prometheus.conf
    global:
      scrape_interval: 15s
    
    scrape_configs:
      - job_name: 'jmx_exporter'
        static_configs:
          - targets: ['localhost:9404']
    EOF
  4. Prometheus 사용법(백그라운드, 데몬)

    1. 실행하기

      cd ~/logstash-sample
      
      PROM_CONF=$(pwd)/prometheus/prometheus.conf
      
      nohup prometheus --config.file=$PROM_CONF > prometheus.nohup 2>&1 & echo $! > prometheus.pid
    2. 출력(stdout) : tail -f ./prometheus.nohup

    3. 프로세스 확인 : ps -p $(cat prometheus.pid)

    4. 프로세스 종료 : kill -9 $(cat prometheus.pid)

  5. 테스트하기

    curl localhost:9090

매트릭은 저장되지만 시각화가 어렵기 때문에 Grafana도 추가하였습니다.

  1. Grafana 설치하기

    brew install grafana
  2. Grafana 설치확인하기

    grafana --version

    grafana version 12.0.0
  3. Grafana Configuration 설정하기

    mkdir -p ~/logstash-sample/grafana
    mkdir -p ~/logstash-sample/grafana/data/
    mkdir -p ~/logstash-sample/grafana/logs/
    mkdir -p ~/logstash-sample/grafana/plugins/
    mkdir -p ~/logstash-sample/grafana/provisioning/datasources/
    
    cd ~/logstash-sample/grafana
    
    cat << 'EOF' > grafana.conf
    EOF
    
    cat << 'EOF' > provisioning/datasources/prometheus.yaml
    apiVersion: 1
    datasources:
      - name: Prometheus
        type: prometheus
        access: proxy
        url: http://localhost:9090
        isDefault: true
        editable: true
    EOF
  4. Grafana 사용법 (백그라운드, 데몬)

    1. 기록용 메타데이터

      # GRAF_ORG_INI=/opt/homebrew/etc/grafana/grafana.ini
      # GRAF_NEW_INI=$(pwd)/grafana/grafana.ini
      # cp $GRAF_ORG_INI $GRAF_NEW_IN
    2. 실행

      cd  ~/logstash-sample
      
      GRAF_CONF=$(pwd)/grafana/grafana.conf
      GRAF_DATASOURCE=$(pwd)/grafana/provisioning/datasources/prometheus.yaml
      GRAF_SHARE_DIR=/opt/homebrew/opt/grafana/share/grafana
      
      cp $GRAF_DATASOURCE $GRAF_SHARE_DIR/conf/provisioning/datasources/
      
      nohup grafana server --config $GRAF_CONF --homepath $GRAF_SHARE_DIR > grafana.nohup 2>&1 & echo $! > grafana.pid
    3. 출력(stdout) : tail -f ./grafana.nohup

    4. 프로세스 확인 : ps -p $(cat grafana.pid)

    5. 프로세스 종료 : kill -9 $(cat grafana.pid)

  5. 실습파일 전부 제거하기

    cd ~/logstash-sample
    
    kill -9 $(cat input.pid)
    kill -9 $(cat logstash.pid)
    kill -9 $(cat prometheus.pid)
    kill -9 $(cat grafana.pid)
    
    rm input.pid
    rm input.nohup
    rm input.log
    
    rm logstash.pid
    rm logstash.nohup
    rm output.log
    
    rm prometheus.pid
    rm prometheus.nohup
    
    rm grafana.pid
    rm grafana.nohup

A.4. 정리하기

가장 쉬운 방법은 컴퓨터를 재시작하는 겁니다.
아래는 재시작을 하지 않는 상황에서 백그라운드, 데몬*과 로그파일 제거하는 구문입니다. (그냥 재시작하는 것을 강추…)

cd ~/logstash-sample

kill -9 $(cat input.pid)
kill -9 $(cat logstash.pid)
kill -9 $(cat prometheus.pid)
kill -9 $(cat grafana.pid)

rm input.pid
rm input.nohup
rm input.log

rm logstash.pid
rm logstash.nohup
rm output.log

rm prometheus.pid
rm prometheus.nohup

rm grafana.pid
rm grafana.nohup

A.5. 각자가 개인적으로 해볼만한 것들

구글링해서 나온 JVM Application Dashboard를 임포트해서 보면서
실제 Logstash Pipeline이 작동하면서 얼마만큼 매트릭을 쓰는지 보는 것도 재밌어 보입니다.

각자가 사용 중인 시스템의 Input, Output만 교체해서 사용하면,
로컬 개발 환경에서도 다양한 Input, Output에 대한 실습이 가능해 보입니다.

A.6. 조금 더 간결한 실습 파일 (과연 만들까?)

깃 저장소에서 Makefile을 이용해서 편리한 실습을 할 수 있도록 구성하는 것?
이걸 만들었을때 어떤 베네핏이 있는지 잘 모르겠어서, 지금 당장 계획은 없습니다.

Share article

Unchaptered