
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, + | |
Filter | Event 처리에 대한 정의 | grok, mutate, drop, clone, geoip, + | |
Output | Output에 대한 정의 | es, file, graphite, statsd, + |
A.2. Logstash 실습하기
Logstash Pipeline을 테스트하고 싶은 것이므로 현실적인 타협*을 하려고 합니다.
💡
[현실적인 타협*] 1. 별도의 컨테이너, 클러스터, VM 사용 안함 2. 무조건 file (input, output)만 사용함 3. 가능한 간단한 실습 구조를 진행할 것 4. 패키지 매니저 등을 적극 활용 (brew, choco)
Logstash 설치하기
brew install logstash # MacOS Package Manager choco install logstash # Windows Package Manager
Logstash 설치 확인하기
logstash --version which logstash
logstash 9.0.1 /opt/homebrew/bin/logstash
작업용 폴더 만들기
mkdir -p ~/logstash-sample cd ~/logstash-sample pwd
/Users/username/logstash-sample
로그 생성기 작업
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
로그 생성기 사용법(백그라운드, 데몬용)
실행 :
nohup ./input.sh > input.nohup 2>&1 & echo $! > input.pid
로그(intput.log) :
tail -f ./input.log
출력(stdout) :
tail -f ./nohup.out
프로세스 확인 :
ps -p $(cat input.pid)
프로세스 종료 :
kill -9 $(cat input.pid)
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
Logstash 실행하기(백그라운드, 데몬)
실행 :
nohup logstash -f "$(pwd)/logstash.conf" > logstash.nohup 2>&1 & echo $! > logstash.pid
로그(intput.log) :
tail -f ./outupt.log
출력(stdout) :
tail -f ./logstash.nohup
프로세스 확인 :
ps -p $(cat logstash.pid)
프로세스 종료 :
kill -9 $(cat logstash.pid)
실습 파일 전부 정리하기
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
로그생성기 실행 :
nohup ./input.sh > input.nohup 2>&1 & echo $! > input.pid
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
로그 생성기 사용법(백그라운드, 데몬용) : A.2. 참고
실행 :
nohup ./input.sh > input.nohup 2>&1 & echo $! > input.pid
로그(intput.log) :
tail -f ./input.log
출력(stdout) :
tail -f ./input.nohup
프로세스 확인 :
ps -p $(cat input.pid)
프로세스 종료 :
kill -9 $(cat input.pid)
JMX Exporeter Configuration 생성하기
cd ~/logstash-sample/jmx-exporter cat << 'EOF' > jmx_exporter.conf startDelaySeconds: 0 scrapeIntervalSeconds: 60 jmxMetrics: - pattern: '.*' EOF
JMX + Logstash 사용법(백그라운드, 데몬)
실행
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
로그(intput.log) :
tail -f ./outupt.log
출력(stdout) :
tail -f ./logstash.nohup
프로세스 확인 :
ps -p $(cat logstash.pid)
프로세스 종료 :
kill -9 $(cat logstash.pid)
테스트하기
# Logstash API Endpoint curl localhost:9600 # Logstash Metric Endpoint curl localhost:9404/metrics
매트릭은 노출되고 있지만 기록되지 않기 때문에 Prometheus를 활용합니다.
💡
brew services start prometheus를 사용하면 Configuration 덮어씌우기나 일부 자동화가 복잡해져서 통일성 측면에서 모두 nohup을 활용했습니다.
Prometheus 설치하기
brew install prometheus
Prometheus 설치확인하기
premetheus --version
prometheus, version 3.3.1 (branch: non-git, revision: non-git)
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
Prometheus 사용법(백그라운드, 데몬)
실행하기
cd ~/logstash-sample PROM_CONF=$(pwd)/prometheus/prometheus.conf nohup prometheus --config.file=$PROM_CONF > prometheus.nohup 2>&1 & echo $! > prometheus.pid
출력(stdout) :
tail -f ./prometheus.nohup
프로세스 확인 :
ps -p $(cat prometheus.pid)
프로세스 종료 :
kill -9 $(cat prometheus.pid)
테스트하기
curl localhost:9090
매트릭은 저장되지만 시각화가 어렵기 때문에 Grafana도 추가하였습니다.
Grafana 설치하기
brew install grafana
Grafana 설치확인하기
grafana --version
grafana version 12.0.0
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
Grafana 사용법 (백그라운드, 데몬)
기록용 메타데이터
# GRAF_ORG_INI=/opt/homebrew/etc/grafana/grafana.ini # GRAF_NEW_INI=$(pwd)/grafana/grafana.ini # cp $GRAF_ORG_INI $GRAF_NEW_IN
실행
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
출력(stdout) :
tail -f ./grafana.nohup
프로세스 확인 :
ps -p $(cat grafana.pid)
프로세스 종료 :
kill -9 $(cat grafana.pid)
실습파일 전부 제거하기
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을 이용해서 편리한 실습을 할 수 있도록 구성하는 것?
이걸 만들었을때 어떤 베네핏이 있는지 잘 모르겠어서, 지금 당장 계획은 없습니다.