2017-07-17 144 views
1

Im有一個ELK Stack + Filebeat的問題。Elasticsearch Logstash Filebeat映射

Filebeat發送類似Apache的日誌到Logstash,它應該解析這些行。 Elasticsearch應該將分割數據存儲在字段中,以便我可以使用Kibana將它們可視化。

問題: Elasticsearch接收日誌,但將它們存儲在單個「消息」字段中。

希望的解決方案:

輸入:

10.0.0.1 some.hostname.at - [27 /月/ 2017:23:59:59 0200]

ES:

「IP」: 「10.0.0.1」

「主機名」: 「some.hostname.at」

「時間戳」:「2 7月/ 6/2017年:23:59:59 +0200"

我logstash配置:

input { 

    beats { 
    port => 5044 
    } 



} 

filter { 


    if [type] == "web-apache" { 
     grok { 
      patterns_dir => ["./patterns"] 
      match => { "message" => "IP: %{IPV4:client_ip}, Hostname: %{HOSTNAME:hostname}, - \[timestamp: %{HTTPDATE:timestamp}\]" } 
      break_on_match => false 
      remove_field => [ "message" ] 
     } 

     date { 
      locale => "en" 
      timezone => "Europe/Vienna" 
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] 
     } 

     useragent { 
      source => "agent" 
      prefix => "browser_" 
     } 
    } 

    } 

output { 

    stdout { 
     codec => rubydebug 
    } 

    elasticsearch { 
      hosts => ["localhost:9200"] 
     index => "test1" 
      document_type => "accessAPI" 
      } 
} 

我Elasticsearch發現輸出:

The "message" field contains my whole log file

我希望有任何ELK專家周圍可以幫助我。 預先感謝您, Matthias

回答

1

您聲明的grok過濾器在這裏不起作用。

嘗試使用:

%{IPV4:client_ip} %{HOSTNAME:hostname} - \[%{HTTPDATE:timestamp}\] 


沒有必要在該領域名字前面seperately指定所需的名稱(你不是想在這裏格式化消息,但提取單獨的域),只在':'之後用括號表示字段名稱會導致你想要的結果。

此外,使用覆蓋功能,而不是remove_field的消息。 點擊此處瞭解詳情:
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins-filters-grok-options

它看起來類似於在最後:

filter { 
    grok { 
    match => { "message" => "%{IPV4:client_ip} %{HOSTNAME:hostname} - \[%{HTTPDATE:timestamp}\]" } 
    overwrite => [ "message" ] 
    } 
} 

您可以測試神交過濾器在這裏:
http://grokconstructor.appspot.com/do/match