Как выбрать конкретный элемент входного XML-журнала в Logstash - PullRequest
0 голосов
/ 02 апреля 2019

Я настраиваю logstash, чтобы можно было получать логи xml из filebeat. Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу печатать весь файл журнала, я просто заинтересован в определенных полях. Для этого я использую плагин фильтра 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": "% {clasification}"}. Я также попытался изменить mutate {add_field => {"class" => "% {clasification}"}} для mutate {add_field => {"class" => "% {clasificacion}"}}, но результат тот же .

Я сомневаюсь, как получить доступ к полю "clasificacion", где я сохранил результат фильтра xml.

Пример журналов, над которыми я работаю:

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

Спасибо Rubi

1 Ответ

0 голосов
/ 02 апреля 2019

Я решил.

Проблема заключалась в том, как я получил доступ к текстовому атрибуту поля классификации.Вы должны использовать @text, если это атрибут, и text (), если это значение поля.

filter {

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

filter {

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

}
...