2017-08-29 61 views
1

嵌套對象我有一個XML結構手柄與Logstah和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> 

我想Logstash以輸出此結構:

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

隨着XML濾波器我嘗試:

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

但是到目前爲止,我只得到這個:

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

如何使「參數」數組而不是其屬性?

我試着用Ruby過濾器來創建「Parameter」對象。但緊跟在XML過濾器之後(即,當我的Ruby過濾器開始時),我必須「加入」陣列"EngValue" : ["1.0", "GCOM", "1.0"]"DecValue" : ["1.0", "1.0"]

問題是,對於「EngValue」的每個元素,我不知道「DecValue」中的相應元素。

回答

1

如果你不介意使用紅寶石,我建議是這樣的:

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"] 
    } 
} 

哪些應該輸出:

{ 
    "@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

事實上,解決辦法是不使用XPath,謝謝 – cadoman