Logstash - beats를 통한 로그 입력 및 로그 파싱
지난 포스팅에서 logstash의 설치와 기본적인 파이프라인 테스트를 해봤습니다.
이번엔 파일 비트로부터 로그를 전달받고 필터를 통해 로그를 파싱해 elasticsearch에 로그를 적재하는 파이프라인을 구축해보도록 하겠습니다.
Filebeat 구성
logstash 파이프라인 생성하기 전 로그를 logstash로 전달하기 위해 Filebeat를 구성해야 합니다. Filebeat는 서버에서 로그를 수집하고 logastash 인스턴스에 전달하는 경량화된 도구입니다. Filebeat는 시스템에서 리소스 사용량이 적으며 Beats input 플러그인은 logstash 인스턴스의 리소스 요구를 최소화 합니다.
일반적으로 Filebeat는 서버에서 동작하며 logstash 인스턴스와 별도의 공간에 위치하지만 실습 편의상 같은 인스턴스에서 구성하도록 하겠습니다.
위의 링크에서 OS에 맞게 설치할 수 있습니다.
GPG-Key 다운로드
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
apt-trasport-https
apt-transport-https는 Debian 계열의 리눅스 시스템에서 apt 패키지 관리자를 통해 HTTPS 프로토콜을 통해 저장소(Repository)에 접근할 수 있도록 지원해주는 패키지입니다.
sudo apt-get install apt-transport-https
repository definition
elastic에서 deb-src를 지원하지 않기 때문에 repository를 추가할 때 add-apt-repository를 사용하지 않는 것을 권장합니다.
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
filebeat install
sudo apt-get update && sudo apt-get install filebeat
run filebeat
sudo systemctl enable --now filebeat
2. Filebeat 환경 구성
먼저 실습에 사용할 sample 로그를 다운로드 받습니다.
wget https://download.elastic.co/demos/logstash/gettingstarted/logstash-tutorial.log.gz
gunzip logstash-tutorial.log.gz
filebeat 환경설정 파일을 수정합니다.
input 설정
filebeat.inputs:
- type: log
id: logstream
enabled: true
paths:
- /root/*.log
output 설정
filebeat를 설치하면 기본 output이 elasticsearch 로 되어 있습니다. 해당 부분을 주석처리 후 logstash 부분을 수정해줍니다.
output.logstash:
hosts: ["localhost:5044"]
filebeat 실행
filebeat가 동작중인 경우 stop 후 해당 명령어를 실행해야 합니다.
sudo /usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"
위의 명령어로 실행하면 아래와 같은 에러가 발생합니다. logstash에서 input 설정을 해주지 않았기 때문입니다.
2023-11-25T18:39:29.855+0900 ERROR [publisher_pipeline_output] pipeline/output.go:154 Failed to connect to backoff(async(tcp://localhost:5044)): dial tcp 127.0.0.1:5044: connect: connection refused
3. Logstash 환경 구성
수정하기 편하도록 sample.conf 파일을 복사해서 사용하겠습니다.
cd /etc/logstash/conf.d
cp ../logstash-sample.conf ./beat.conf
아래와 같이 설정파일을 수정해줍니다.
input {
beats {
port => 5044
}
}
output {
stdout {
codec => rubydebug
}
}
환경설정이 잘 되었는지 확인하기 위해 아래의 명령어를 실행해 줍니다 .
--config.test_and_exit 옵션은 환경설정 파일의 에러를 확인하는데 사용됩니다.
/usr/share/logstash/bin/logstash -f beat.conf --config.test_and_exit
확인이 완료되면 ok 라는 메세지를 확인할 수 있습니다.
Configuration OK
[INFO ] 2023-11-25 10:16:30.749 [LogStash::Runner] runner - Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
확인이 완료되면 아래의 명령어로 logstash를 실행시켜 줍니다.
--config.reload.automatic 옵션은 자동으로 환경설정 파일을 불러오기 때문에 서비스를 중단하지 않아도 됩니다.
/usr/share/logstash/bin/logstash -f baet.conf --config.reload.automatic
}
[INFO ] 2023-11-25 11:15:21.955 [[main]<beats] Server - Starting server on port: 5044
[INFO ] 2023-11-25 11:15:23.093 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
성공적으로 실행이 완료되면 아래와 같은 출력을 확인할 수 있습니다.
"@timestamp" => 2023-11-25T12:12:35.590Z,
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"agent" => {
"id" => "6739e27a-efc9-4467-9438-62ee1fab2b26",
"name" => "master",
"hostname" => "master",
"type" => "filebeat",
"version" => "7.17.15",
"ephemeral_id" => "67462961-5d0c-4f74-85f9-59bfcabb4d36"
},
"ecs" => {
"version" => "1.12.0"
},
"input" => {
"type" => "log"
},
"log" => {
"file" => {
"path" => "/root/logstash-tutorial.log"
},
"offset" => 24248
}
}
4. 에러
logstash 데몬이 이미 실행중인 상태에서 logstash를 실행했더니 이미 5044 포트를 사용중이라는 에러가 발생했습니다.
logstash 데몬을 중지 후 명령어를 실행해야 합니다.
[ERROR] 2023-11-25 11:12:28.467 [[main]<beats] javapipeline - A plugin had an unrecoverable error. Will restart this plugin.
Pipeline_id:main
Plugin: <LogStash::Inputs::Beats port=>5044,
처음 에러가 발생했을 떄의 USER 는 logstash로 되어있지만 수동으로 logstash를 실행했을 때의 USER 는 root로 되어있음을 확인할 수 있습니다.
## 처음 에러가 발생했을 당시 5044 포트
root@master:~# lsof -i :5044
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 29061 logstash 88u IPv6 579743 0t0 TCP *:5044 (LISTEN)
## logstash 데몬 중지 후 5044 포트
root@master:~# lsof -i :5044
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 32211 root 83u IPv6 631281 0t0 TCP *:5044 (LISTEN)
처음 logstash를 실행하지 않고 filebeat를 실행하니 5044포트가 거절되었다는 에러가 발생했습니다.
2023-11-25T18:42:56.027+0900 ERROR [publisher_pipeline_output] pipeline/outpu t.go:154 Failed to connect to backoff(async(tcp://localhost:5044)): dial tcp 12 7.0.0.1:5044: connect: connection refused
logstash 와 filebeat가 모두 동작하는데 출력이 되지 않아 많이 당황했습니다.
filebeat는 파일을 읽은 후 파일에 대한 메타 정보를 /var/lib/filebeat/registry/filebeat/log.json 파일에 기록합니다.
제 경우에는 이미 샘플로 지정한 로그파일을 모두 읽어들였기 때문에 더이상 logstash에 파일을 보내지 않아 어떤 출력도 이루어지지 않았습니다.
따라서 해당 메타 정보를 초기화 해주어야 했습니다. 초기화는 아래의 명령어로 수행 했습니다.
echo "[]" > /var/lib/filebeat/registry/filebeat/log.json
초기화 후 정상적으로 출력이 되는 것을 확인할 수 있었습니다.