2020년 4월 18일 토요일

Logstash 필터 fingerprint

로그가 중복으로 수집될 때가 있다. 다음은 테스트 로그.
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"
 }
}

깔끔하게 중복을 제거할 수 있다.


관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스