2014-12-10 2 views
3

그래서 Apache URL 액세스를 분석하기 위해 표준 ELK 스택을 사용하고 있습니다. 제대로 작동하고 있지만 KV 필터를 사용하여 URL 매개 변수를 필드로 구분하려고합니다. 더 나은 쿼리를 작성할 수있게 해줍니다.패턴을 사용하여 이벤트에서 필드 제거

내 문제는 내가 분석하고있는 앱에 동적으로 생성 된 '캐시 - 버스 팅 (cache-busting)'매개 변수가있어 수만개의 '필드'로 이어지고 각각 한 번 발생합니다. ElasticSearch는 이와 관련하여 심각한 문제가있는 것으로 보이며 나에게 가치가 없기 때문에이를 제거하고 싶습니다. 다음은 위의 예에서 패턴

GET /page?rand123PQY=ABC&other_var=something GET /page?rand987ZDQ=DEF&other_var=something

의 예는, 매개 변수가 나는 시작 '랜드'를 제거 할. 나는 패턴 rand[A-Z0-9]*=[A-Z0-9]* 일치하는 모든 필드를 필터링 할 수있는 방법

filter { grok { path => "/var/log/apache/access.log" type => "apache-access" } kv { field_split => "&?" } } 있습니까 : 현재 내 logstash.conf 쿼리 문자열 매개 변수를 추출 KV 다음에 액세스 로그에서 필드를 추출하는 grok 수 사용? 필자가 본 대부분의 예는 필드를 정확한 이름으로 타겟팅하는 것으로, 사용할 수 없습니다. 요청 필드를 새로운 필드로 regexing하고 KV를 실행 한 다음 제거하는 것에 대해 궁금해했습니다. 그게 효과가 있니?

답변

7

경우 알려진 및 검색 kv filter에 대한 target을 설정 mutate filter와 메시지의 최상위 레벨에 흥미 필드를 이동하고 함께 필드를 삭제할 수 잘 정의에 관심이 필드의 세트 중첩 된 키/값 쌍 나는 이것이 당신이 결국 제안한 것 같다고 생각합니다.

은 또한 당신이 사용할 수있는 ruby filter :

당신이 기반으로 트리밍 할 수 있습니다 prune라는 이름의 플러그인이있다 2017 년 기준으로이 일자 및 대답했지만, 그것으로 찾는 사람이 알고
filter { 
    ruby { 
    code => " 
     event.to_hash.keys.each { |k| 
     if k.start_with?('rand') 
      event.remove(k) 
     end 
     } 
    " 
    } 
} 
+0

완벽! 전 필드의 전체 집합을 모르지만, 당신이 제공 한 루비 필터는 처음으로 작동했습니다. 나는이 문제를 해결하기 위해 필터 목록을 위아래로 줄 알았지 만 루비 필터를 보지 않았다. 나는 그것을 다시 사용할 것이라고 생각한다. – barnyr

2

패턴을 포함한 차이 기준.

prune { 
    blacklist_names => ["[0-9]+", "unknown_fields", "tags"] 
}