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
이라 적고 저장하면 데이터가 바로 목적지로 전달된다.
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) 이후의 부분을 새로 읽어온다.
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는 변하지 않고
새로 추가한 줄만 정상적으로 수집되는 것을 확인할 수 있다.
'인프라,데이터 > Elasticsearch, Logstash, Kibana' 카테고리의 다른 글
Logstash multiple kinesis input (0) | 2022.03.12 |
---|---|
Logstash 6.3.x 버전에서의 GC(Garbage Collector) (0) | 2022.03.10 |
Logstash는 로그를 왜 message라는 field로 저장할까? (0) | 2022.02.16 |
Logstash에서 SQS, Elasticsearch로 데이터가 들어가지 않을 때 (0) | 2022.01.07 |
Logstash nested json, json in json parsing error (0) | 2022.01.04 |