2011-01-10 00:00:00 W3SVC1 192.168.48.11 GET /IL.jpg
2011-01-10 00:00:00 W3SVC1 192.168.48.11 GET /IL.jpg
연동 결과는 다음과 같다.
같은 로그의 중복을 막으려면 어떻게 해야 할까? 로그 원천에서 중복을 막는 게 가장 좋겠지만 피치 못할 환경이라면 fingerprint 필터가 해답이 될 수 있다.
fingerprint? 지문? 뭔가 했는데 해시값을 만들어 줌. 해시값을 만들어서 어디 쓸까 싶었는데 이런 식의 응용이 가능하다. 다음은 해당 필터를 적용한 파이프라인.
input {
file {
path => "d:/test.log"
start_position => "beginning"
sincedb_path => "nul"
}
}
filter {
fingerprint {
method => "SHA1"
source => "message"
target => "fingerprint"
}
}
output {
stdout {}
}
실행 결과는 다음과 같다.
[2020-04-18T19:03:03,728][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9602}
D:/ELK/logstash-7.6.2-2/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
"message" => "2011-01-10 00:00:00 W3SVC1 192.168.48.11 GET /IL.jpg\r",
"@version" => "1",
"host" => "MHKANG",
"path" => "D:/test.log",
"fingerprint" => "700bfd0c250f9bf5285d9686b441a3e34a9c086d",
"@timestamp" => 2020-04-18T10:03:03.979Z
}
{
"message" => "2011-01-10 00:00:00 W3SVC1 192.168.48.11 GET /IL.jpg\r",
"@version" => "1",
"host" => "MHKANG",
"path" => "D:/test.log",
"fingerprint" => "700bfd0c250f9bf5285d9686b441a3e34a9c086d",
"@timestamp" => 2020-04-18T10:03:03.952Z
}
SHA1으로 message 필드의 해시값을 만들어서 fingerprint 필드에 저장. (사용된 옵션은 모두 디폴트) 입력값이 같으면 출력값도 같다는 사실을 알 수 있다.
이후 elasticsearch 아웃풋 플러그인의 document_id 옵션으로 fingerprint 필드를 지정해주면 해시값이 같은 이벤트는 모두 overwrite.
output {
elasticsearch {
hosts => "192.168.56.1"
document_id => "fingerprint"
}
}
깔끔하게 중복을 제거할 수 있다.
관련 글
댓글 없음:
댓글 쓰기