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

问题描述 投票:0回答:1

我正在设置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}”}}来改变{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>

谢谢Rubi

xpath xml-parsing logstash
1个回答
0
投票

我解决了

问题是我访问分类字段的文本属性的方式。如果它是属性,则必须使用@text,而case中的text()是字段的值。

filter {

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

filter {

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

}
© www.soinside.com 2019 - 2024. All rights reserved.