2017-08-29 3 views
1

Ich habe eine XML-StrukturGriff verschachteltes Objekt mit Logstah und XPath

<Event> 
    <Core Id="10233" /> 
    <Parameters> 
     <Parameter EngValue="1.0" DecValue="1.0" /> 
     <Parameter EngValue="GCOM" /> 
     <Parameter EngValue="1.0" DecValue="1.0" /> 
    </Parameters> 
</Event> 

Ich möchte Logstash diese Struktur Ausgang:

{ 
    "CoreID" : "10233", 
    "Parameter" : [ 
    { 
     "EngValue" : "1.0", 
     "DecValue" : "1.0" 
    }, 
    { 
     "EngValue" : "GCOM" 
    }, 
    { 
     "EngValue" : "1.0", 
     "DecValue" : "1.0" 
    } 
    ] 
} 

Mit den XML-Filter hat ich versucht:

xpath => [ 
    "/Event/Core/@Id", "CoreID", 
    "/Event/Parameters/Parameter/@DecValue", "[Parameter][DecValue]", 
    "/Event/Parameters/Parameter/@EngValue", "[Parameter][EngValue]", 
] 

Aber bis jetzt habe ich nur dieses:

{ 
    "CoreID" : "10233", 
    "Parameter" : { 
     "EngValue" : ["1.0", "GCOM", "1.0"], 
     "DecValue" : ["1.0", "1.0"] 
    } 
} 

Wie kann ich "Parameter" das Array anstelle seiner Attribute machen?

Ich habe versucht, einen Ruby-Filter zu verwenden, um das Objekt "Parameter" zu erstellen. Aber direkt nach dem XML-Filter (d. H. Wenn mein Ruby-Filter beginnt) muss ich die Arrays "EngValue" : ["1.0", "GCOM", "1.0"] und "DecValue" : ["1.0", "1.0"] "verbinden".

Das Problem ist, dass ich für jedes Element von "EngValue" das entsprechende Element in "DecValue" nicht kenne.

Antwort

1

Wenn Sie nicht mit Ruby nichts, ich so etwas wie dies würde vorschlagen:

filter { 
    xml { 
    source => "message" 
    target => "parsed" 
    } 

    ruby { 
     code => ' 
     event.set("Parameter", event.get("[parsed][Parameters][0][Parameter]")) 
     event.set("CoreId", event.get("[parsed][Core][0][Id]")) 
     ' 
    } 


    mutate { 
    remove_field => ["message", "parsed"] 
    } 
} 

Welche Ausgabe sollte:

{ 
    "@timestamp" => 2017-08-29T13:45:46.112Z, 
     "@version" => "1", 
      "host" => "my-host", 
    "Parameter" => [ 
     [0] { 
      "DecValue" => "1.0", 
      "EngValue" => "1.0" 
     }, 
     [1] { 
      "EngValue" => "GCOM" 
     }, 
     [2] { 
      "DecValue" => "1.0", 
      "EngValue" => "1.0" 
     } 
    ], 
     "CoreId" => "10233" 
} 
+0

Tatsächlich wurde die Lösung nicht XPath verwenden, dank – cadoman

Verwandte Themen