如何在Logstash中选择xml输入日志的特定元素

时间:2019-04-02 10:21:26

标签: xpath xml-parsing logstash

我正在设置logstash,以便能够从filebeat接收xml日志。我面临的问题是我不想打印整个日志文件,我只对特定字段感兴趣。为此,我正在使用xml过滤器插件和Prune过滤器插件。

例如,我正在使用IDMEF-Message警报,并且对“分类”字段感兴趣。

我所做的配置是:

input {
    beats {
        port => "5044"
    }
}

#I'm just interested in the log alert.
filter {    
  prune {      
    whitelist_names => [ "^message$"]
  }    
}    

#Get de classification text from the alert
filter {    
  xml {
    source => "message"
    store_xml => false
    target => "clasifications"
    xpath => ["/IDMEF-Message/Alert/Classification/text()", "clasificacion"]
    remove_field => "message"
  }
}

#Add a new field class with the clasifications value
filter {    
  mutate{add_field=>{"class"=>"%{clasifications}"}}
}

#remove message and just let the class field
filter {    
  prune {    
    whitelist_names => [ "clas"]
  }    
}  

output {
 file {
   path => "~/xml_logstash.txt"
 }
}

我收到的输出仅为{“ class”:“%{clasifications}”}。我还尝试将mutate {add_field => {“ class” =>“%{clasifications}”}}更改为mutate {add_field => {“ class” =>“%{clasificacion}”}},但结果相同

我的疑问是如何访问存储xml过滤器结果的“ clasificacion”字段。

我正在处理的日志的示例是:

<IDMEF-Message>
   <Alert messageid="...">
      <Analyzer ...
      </Analyzer>
      <CreateTime ... </CreateTime>
      <DetectTime ... </DetectTime>
      <AnalyzerTime ... </AnalyzerTime>
      <Source> 
        ...
      </Source>
      <Target>
         ...
      </Target>
      <Classification text="Text_Class" />
<IDMEF-Message>

谢谢 鲁比

1 个答案:

答案 0 :(得分:0)

我解决了。

问题是我访问分类字段的text属性的方式。如果它是一个属性,则必须使用@text;如果是字段的值,则必须使用text()。

filter {

  xml {
    source => "message"
    store_xml => false
    target => "clasifications"
    xpath => ["/IDMEF-Message/Alert/Classification/@text", "clasificacion"]
   }
}

filter {

  mutate{add_field=>{"clasificacion"=>"%{clasificacion}"}}

}