본문 바로가기

인프라,데이터/Elasticsearch, Logstash, Kibana

Logstash file input시 파일 열고 수정하면 데이터 중복 집계되는 이유

input {
    file {
        path => "/home/test/*.log"
        start_position => "beginning"
    }
}
start_position => "beginning" 으로 로그스태시가 파일을 처음부터 읽도록 설정한다.
오래된 데이터를 임포트할 때 유용하다. (매번 파일의 처음에서 읽는 게 아니다.)

로그스태시 file input 설정을 주면, 로그스태시가 시작하면서 sincedb path를 자동으로 생성한다.

[INFO ] 2022-02-25 06:21:51.942 [[main]-pipeline-manager] file - No sincedb_path set, generating one based on the "path" setting {:sincedb_path=>"/usr/share/logstash/data/plugins/inputs/file/.sincedb_33ae29519d40b552e858418f58db4216", :path=>["/home/test/*.log"]}

 

테스트 파일을 만들고 

test1
test1
test1

이라 적고 저장하면 데이터가 바로 목적지로 전달된다. 

3건의 로그가 잘 집계되었다.

 

test1
test1
test1
test2
test2
test2

그러나 해당 파일을 열고, 라인을 3줄 더 추가하고 저장하고 나니 데이터가 중복 전송되는 걸 발견했다.

처음 라인부터 데이터가 다시 다 전송되었다.

왜일까 하고 찾아봤는데, 이런 식으로 파일을 연 후 내용을 수정하고 저장하면 Sincedb의 inode가 바뀌기 때문이다. 
inode는 Sincedb의 구분자 같은 역할을 하는데, 이 inode가 달라지면 파일이 다른 파일처럼 인식되어 다시 읽힌다. 

sh-4.2# cat /usr/share/logstash/data/plugins/inputs/file/.sincedb_33ae29519d40b552e858418f58db4216
2242160 0 217 327 1645770143.5443509 /home/test.log

Sincedb 경로를 cat 하면 나오는 순서는
inode | major device number | minor device number | byte offset | last active timestamp | last known path 이다. 

test1
test1
test1
test2
test2
test2

파일을 열고, 내용을 3줄 추가하고 저장한다.

sh-4.2# cat /usr/share/logstash/data/plugins/inputs/file/.sincedb_33ae29519d40b552e858418f58db4216
2242160 0 217 327 1645770143.5443509
2242165 0 217 556 1645770288.9164839 /home/test.log

inode가 2242160에서 2242165로 변했다.
그렇기 때문에 로그스태시는 이전 기록을 다시 읽어들여 전송한다.

처음 라인부터 데이터가 다시 다 전송되었다.

 

 

test1
test1
test1
test2
test2
test2
test3
test3
test3

또 한번 파일을 열고 수정하고 저장해보니, 다시 inode가 바뀐다.

sh-4.2# cat /usr/share/logstash/data/plugins/inputs/file/.sincedb_33ae29519d40b552e858418f58db4216
2242160 0 217 572 1645770390.129582 /home/test.log
2242165 0 217 556 1645770288.9164839

하지만 이전 inode인 2242160으로 변하였기에, 이전에 읽어들인 부분(test1) 이후의 부분을 새로 읽어온다. 

test2 로그가 중복 수집되어 총 6건의 로그가 수집된다.

 

test1
test1
test1
test2
test2
test2
test3
test3
test3
test4
test4
test4

4번째로 데이터를 추가하고 전송되는 걸 확인해보니, test3과 test4 총 6개의 로그가 전송되었다.

sh-4.2# cat /usr/share/logstash/data/plugins/inputs/file/.sincedb_33ae29519d40b552e858418f58db4216
2242160 0 217 96 1645774772.329354 
2242165 0 217 72 1645774268.784945 /home/test.log

그리고 inode는 다시 2242165로 변하였다.

결론적으로 파일을 직접 열고 수정할 시, 2개의 inode 번호를 옮겨가면서 저번 inode가 읽어온 이후의 줄을 다시 중복해서 읽어오는 것을 알 수 있다. 

하지만 파일을 직접 열지 않고 수정하면 inode가 바뀌지 않는다.

echo "* test5" >> /home/test.log
echo "* test5" >> /home/test.log
echo "* test5" >> /home/test.log

이런 식으로 echo 로 텍스트를 추가해주면, 

sh-4.2# cat /usr/share/logstash/data/plugins/inputs/file/.sincedb_33ae29519d40b552e858418f58db4216
2242160 0 217 96 1645774772.329354 
2242165 0 217 120 1645775055.6018 /home/test.log

inode는 변하지 않고

새로 추가한 줄만 정상적으로 수집되는 것을 확인할 수 있다.