[Logstash] input file plugin 에 대해서 알아 봅니다.

Elastic/Logstash 2017. 7. 19. 13:25

가장 많이 사용하고 있는 logstash input plugin 중에 하나라고 생각 합니다.

저 역시 현업에서 제일 많이 사용하고 있는 plugin 이기도 합니다.


elastic reference 문서를 보시면 설명이 잘 나와 있습니다.

하지만 신뢰 할 수 없는 기억력으로 인해서 한번 작성해 봅니다.


이미 많은 분들이 input file plugin 에 대해서 많은 자료들을 공유해 주셨기 때문에 구글링 몇 번 해보시면 좋은 정보를 얻으실 수 있습니다.


참고문서)
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html


logstash input file 기본 동작은 ruby-filewatch를 이용한 tail 입니다. 


주요 설정 정보)

1. start_position

이 설정은 logstash 실행 시 읽기 작업에 대한 수행 정보를 정의 합니다.

beginning 과 end 설정은 2번 sincedb 파일이 있고 없고에 따라 동작이 다르다고 생각 하시면 됩니다.

즉, sincedb 에 offset 정보가 있으면 해당 offset 부터 읽게 되고 없으면 beginning, end 설정 동작 방식으로 동작 합니다.

beginning 은 처음(이전) 부터 읽어 들이고, end 는 가장 최근 부터 읽어 들이게 됩니다.


결국, 데이터의 유실 없이 데이터를 읽기 위해서는 beginning 으로 설정 하셔야 합니다.

default value 는 end 입니다.


2. sincedb

이건 설정은 아니고 sincedb 파일에 대한 내용입니다.

logstash input file 을 사용하게 되면 sincedb 파일에 어디까지 읽었는지 정보를 기록하게 됩니다.

reference 문서를 보시면 sincedb 에 기록하는 정보에 대해서 설명이 자세히 나와 있습니다.


Sincedb files are text files with four columns:


The inode number (or equivalent).

The major device number of the file system (or equivalent).

The minor device number of the file system (or equivalent).

The current byte offset within the file.


$ cat .sincedb_8d6238d5255f464e564ecdb307fe0c0c

7341423 0 51713 67247655


sincedb_path 를 설정 하지 않을 셨을 경우는 user home directory 를 확인해 보시거나,

~/logstash-5.5.0/data/plugins/inputs/file/ 을 확인해 보시면 됩니다.


#pick SINCEDB_DIR if available, otherwise use HOME

sincedb_dir = ENV["SINCEDB_DIR"] || ENV["HOME"]

※ .sincedb 작성 시 overwrite 인지 append 인지 확인 후 공유 드리겠습니다. ㅡ.ㅡ;

미쳐 확인을 못했내요.

->

input file 을 여러개 등록 하면 sincedb 가 여러개 생성이 됩니다.

참고 파일은 filewatch 소스코드를 보시면 되시겠습니다.

($ ~elastic/logstash-5.5.0/vendor/bundle/jruby/1.9/gems/filewatch-0.9.0/lib/filewatch)


input file 을 여러개 등록 하면 sincedb 에 inode 가 다른게 여러게 생성 됩니다.

즉, overwrite(update) 이라고 보시면 되겠습니다.

위에 잘못 설명한 부분은 확인 없이 그냥 동작 하고 있는 것만 가지고 작성을 하다 보니 놓친 부분 입니다. 죄송합니다.

기존에 logstash 가 처리 하고 있는 log file 자체의 변경이 발생 하였을 경우 기 생성된 sincedb 에 row가 추가 되면서 변경된 log file 의 inode 값과 offset 정보가 추가 되게 됩니다.

- 파일이 삭제 된 후 다시 생성 된 경우가 대표적인 예가 되겠습니다.


189699226 -rw-r--r--  1 henry  staff  105  7 20 15:03 file.log

$ rm -f file.log

189766986 -rw-r--r--  1 henry  staff  120  7 20 15:04 file.log


$ cat .sincedb_27eb92c828fb885f9741fac9e538c0e1

189699226 1 4 285

189766986 1 4 150


3. sincedb_write_interval

이 설정은 logstash 가 열심히 일을 하고 어디까지 일을 했는지 주기적으로 기록하도록 하는 주기를 작성 하게 됩니다.

설정 주기가 너무 길게 되면 logstash가 비정상 종료 후 재 실행 되었을 때 데이터가 중복으로 입력 될 수도 있으니 적절한 주기를 찾아서 설정 하는게 중요 합니다.


현재 inode 파일의 읽어 들인 offset 정보를 sincedb 에 기록 하게 됩니다.

default value 는 15초로 되어 있습니다.


4. stat_interval

이 설정은 logstash 가 읽어야 하는 로그 파일에 새로운 로그가 추가 되었는지 확인하기 위한 주기를 설정 하게 됩니다.

reference 문서에서는 아래와 같이 설명 하고 있습니다.

How often (in seconds) we stat files to see if they have been modified. Increasing this interval will decrease the number of system calls we make, but increase the time to detect new log lines.


system call 을 줄일 것인지 빠르게 신규 로그 감지 할 것인지 결정을 하셔야 합니다.

default value 는 1초 입니다.


5. discover_interval

이 설정은 filename pattern 을 이용해서 신규 로그 파일이 추가 되었는지 확인 하기 위한 주기를 설정 하게 됩니다.

 default value 는 15초 입니다.


여기까지 알아 두면 좋은 설정들은 이렇습니다.

이를 기반으로 샘플 설정을 작성해 보면 아래와 같습니다.


input {

  file {

    path => "/XXXX/logs/test-file.log"

    start_position => "beginning"

  }

}


결국 기본 설정으로 돌려도 크게 무리는 없습니다.

다만, 생성되는 로그 파일의 크기와 worker, queue 설정 크기에 따라 값들을 최적화 하시면 됩니다.

왜냐면 사용하시는 환경 마다 다 다르기 때문이고, 환경에 맞춰서 튜닝을 할 수 밖에 없기 때문 입니다.


3, 4, 5 번에 대한 테스트는

3번은 설정 변경 하시면서 sincedb 값이 바뀌는 걸 보시면 됩니다.

4번은 설정 변경 하시면서 output  으로 언제 전달 되는지 보시면 됩니다.

5번은 설정 변경 하시면서 log file을 rotate 해보시면 됩니다.


여기서는 그냥 4번 초간단 테스트 예제만 보여 드리겠습니다.


1. log file 을 생성하고 해당 파일에 log를 기록 합니다.

while true;
do

DATE=$(date '+%Y%m%d%H%M%S');

echo $DATE >> /XXXX/logs/test-file.log;

cat test-file.log;

sleep 2;

done

코드 보셔서 아시겠지만 2초 마다 datetime  을 file.log 에 기록하는 스크립트 입니다.


2. logstash 를 실행 시킵니다.

[file.config]

input {

  file {

    path => "/XXXX/logs/test-file.log"

    start_position => "beginning"

    stat_interval => 30

  }

}


output {

  stdout {

    codec => "rubydebug"

  }

}


$ bin/logstash -f ./config/file.conf --config.reload.automatic


이렇게 하시면 30초 마다 file.log 에 기록된 정보를 읽어 오게 됩니다.

참 쉽죠잉.


여기까지 logstash input file 에 대한 설명이였는데요.

도움이 되셨다면 좋겠습니다.


: