ELK

Logstash - beats를 통한 로그 입력 및 로그 파싱

mingming_96 2023. 11. 25. 21:11

지난 포스팅에서 logstash의 설치와 기본적인 파이프라인 테스트를 해봤습니다. 

이번엔 파일 비트로부터 로그를 전달받고 필터를 통해 로그를 파싱해 elasticsearch에 로그를 적재하는 파이프라인을 구축해보도록 하겠습니다. 

 

Filebeat 구성 

logstash 파이프라인 생성하기 전 로그를 logstash로 전달하기 위해 Filebeat를 구성해야 합니다. Filebeat는 서버에서 로그를 수집하고 logastash 인스턴스에 전달하는 경량화된 도구입니다. Filebeat는 시스템에서 리소스 사용량이 적으며 Beats input 플러그인은 logstash 인스턴스의 리소스 요구를 최소화 합니다. 

일반적으로 Filebeat는 서버에서 동작하며 logstash 인스턴스와 별도의 공간에 위치하지만 실습 편의상 같은 인스턴스에서 구성하도록 하겠습니다. 

 

1. Filebeat 설치 

 

위의 링크에서 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

 

초기화 후 정상적으로 출력이 되는 것을 확인할 수 있었습니다.