2017-10-12 3 views
0

Ich bin absolut neu zu Logstash und ich versuche, meine mehrzeilige logentries zu analysieren, die in dem folgenden Format sindLogstash mehrzeilige Logfile XML Parsing Filter

<log level="INFO" time="Wed May 03 08:25:03 CEST 2017" timel="1493792703368" host="host"> <msg><![CDATA[Method=GET URL=http://localhost (Vers=[Version], Param1=[param1], Param2=[param1]) Result(Content-Length=[22222], Content-Type=[text/xml; charset=utf-8]) Status=200 Times=TISP:1098/CSI:-/Me:1/Total:1099]]> </msg> </log>

Wissen Sie, wie Sie den Filter in logstash implementieren Config zu können, werden die folgenden Felder in Elasticsearch

Zeit zu indizieren, host, Vers, Param1, Param2, TISP

Vielen Dank

+0

Verwenden Sie mehrzeiligen Codec am Eingang, dann Xml-Filter mit Xpath. – baudsp

Antwort

0

OK, ich habe herausgefunden, wie es geht. Das ist meine pipeline.conf Datei und es funktioniert

input { 
     beats { 
       port => 5044 
     } 
} 

filter { 
     xml { 
       store_xml => false 
       source => "message" 
       xpath => [ 
       "/log/@level", "level", 
       "/log/@time", "time", 
       "/log/@timel", "unixtime", 
       "/log/@host", "host_org", 
       "/log/@msg", "msg", 
       "/log/msg/text()","msg_txt" 
       ] 
     } 

     grok { 
       break_on_match => false 
       match => ["msg_txt", "Param1=\[(?<param1>-?\w+)\]"] 
       match => ["msg_txt", "Param2=\[(?<param2>-?\w+)\]"] 
       match => ["msg_txt", "Vers=\[(?<vers>-?\d+\.\d+)\]"] 
       match => ["msg_txt", "TISP:(?<tisp>-?\d+)"] 
       match => [unixtime, "(?<customTime>-?\d+)"] 
     } 
     if "_grokparsefailure" in [tags] { 
       drop { } 
     } 

     mutate { 
       convert => { "tisp" => "integer" } 
     } 

     date { 
       match => [ "customTime", "UNIX_MS"] 
       target => "@timestamp" 
     } 
     if "_dateparsefailure" in [tags] { 
       drop { } 
     } 



} 

output { 
     elasticsearch { 
       hosts => "elasticsearch:9200" 
       user => user 
       password => passwd 
     } 
}