2017-04-11 6 views
0

로그 파일 (http://codepad.org/vAMFhhR2)이 있는데 그 중 특정 번호를 추출하려고합니다 (라인 18) 사용자 정의 패턴 grok 필터를 작성하여 http://grokdebug.herokuapp.com/에서 테스트했습니다. 그것은 잘 작동하고 원하는 값을 추출합니다. 여기Logstash 그루크 필터 사용자 정의 패턴이 작동하지 않습니다.

는 logstash.conf의 모습 방법은 다음과 같습니다

input { 
    tcp { 
     port => 5000 
    } 
} 

filter { 
    grok{ 
     match => [ "message", "(?<scraped>(?<='item_scraped_count':).*(?=,))" ] 
    } 
} 

output { 
    elasticsearch { 
     hosts => "elasticsearch:9200" 
    } 
} 

하지만 키바

생각에 동일한 로그에서 모든 기록과 일치하지 않는 이유는 무엇입니까?

+0

이 선구자와 표정으로 무엇을 이루고자합니까? 일치하지 않는 줄을 버리려고하십니까? –

답변

0

정규 표현식이 유효 할 수 있지만 lookahead 및 lookbehind ("? ="및 "? < =")는이 문맥에서 적합하지 않습니다.

match => [ "message", "'item_scraped_count': %{NUMBER:scraped}" ] 

이가 '번호'grok 수 built-in pattern를 사용하여, scraped라는 필드로 'item_scraped_count': 후 번호를 추출합니다 : 대신 당신은 훨씬 간단 필터를 사용할 수 있습니다. 키바의

결과 :

{ 
    "_index": "logstash-2017.04.11", 
    "_type": "logs", 
    "_source": { 
    "@timestamp": "2017-04-11T20:02:13.194Z", 
    "scraped": "22", 
    (...) 
    } 
} 

나는 또 다른 개선을 제안 할 수있는 경우 :

input { 
    tcp { 
     port => 5000 
     codec => multiline { 
      pattern => "^(\s|{')" 
      what => "previous" 
     } 
    } 
} 

이 뜻 : 당신의 메시지를 쉽게 multiline 입력 코덱을 사용하여 병합 할 수있는 여러 라인에 분산되어 있기 때문에 공백 또는 {'으로 시작하는 모든 행을 이전 행과 병합하십시오.

+0

그 덕분에, 고마워. 어디에서 logstash 필터 코딩에 대한 더 많은 지식을 얻을 수 있습니까? – IbrahimSharaf

+0

공식 문서는 상당히 도움이됩니다. "도움 받기"섹션을 확인하십시오. https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html –

+0

다중 행 필터에 관해서는 추가했습니다. 하지만 나는 모든 로그 파일을 Kibana에서 하나의 메시지로 찾는 것을 기대했지만 메시지 2 개 (http://codepad.org/gNGvbi4j)로 나뉘어졌습니다. (http://codepad.org/qvRjg925) – IbrahimSharaf