XML et logstash : index non rempli

Bonjour à tous,
je débute sur ELK et j'ai déjà fait quelques progrès (plusieurs indexes et quelques dashboard sur Kibana). Jusqu'à présent j'utilisais des parsers "homemade" pour générer mes fichiers json pour l'indexation.
Là, je pars sur le parsing de XML avec logstash. Je suis sur une machine windows.

Après quelques essais, en parcourant la doc et les forums, j'ai maintenant un fichier de conf qui semble ok (testé avec --config.test_and_exit )
Mais j'ai dû louper un (ou plusieurs) truc car logstash ne fait rien du tout.
Il reste bloqué en mode

[2018-12-02T05:40:26,317][INFO ][filewatch.observingtail  ] START, creating Discoverer, Watch with file and sincedb collections
[2018-12-02T05:40:26,305][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2018-12-02T05:40:26,811][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

et rien ne se passe.

Mon fichier XML d'exemple est le suivant:

<?xml version="1.0" encoding="ISO-8859-1"?>
<JDBOR>
  <DisorderList count="2">
    <Disorder id="2">
      <OrphaNumber>58</OrphaNumber>
      <Name lang="en">Alexander disease</Name>
      <DisorderFlagList count="1">
        <DisorderFlag id="475">
          <Label>on-line</Label>
        </DisorderFlag>
      </DisorderFlagList>
      <SynonymList count="1">
        <Synonym lang="en">AxD</Synonym>
      </SynonymList>
      <DisorderType id="21394">
        <Name lang="en">Disease</Name>
      </DisorderType>
    </Disorder>
    <Disorder id="3">
      <OrphaNumber>61</OrphaNumber>
      <Name lang="en">Alpha-mannosidosis</Name>
      <DisorderFlagList count="1">
        <DisorderFlag id="475">
          <Label>on-line</Label>
        </DisorderFlag>
      </DisorderFlagList>
      <SynonymList count="1">
        <Synonym lang="en">Lysosomal alpha-D-mannosidase deficiency</Synonym>
      </SynonymList>
      <DisorderType id="21394">
        <Name lang="en">Disease</Name>
      </DisorderType>
    </Disorder>
  </DisorderList>
</JDBOR>

Et mon fichier de conf:

input {
  file {
    path => "C:\Elastic\logstash-6.4.2\bin\disample.xml"
    start_position => "beginning"
    sincedb_path => "NUL"
    codec => multiline {
    ##  pattern => "^<Disorder "
	  pattern => "^<Disorder .*>"
      negate => true
      what => "previous"
    }
  }
}
filter 
{
  xml {
      store_xml => "false"
      source => "disample.xml"
      xpath => [ 
        "/JDBOR/DisorderList/Disorder/Name/text()", "Disease_name",
		"/JDBOR/DisorderList/Disorder/OrphaNumber/text()", "Orpha",
		"/JDBOR/DisorderList/Disorder/SynonymList/Synonym/text()", "synonyms",
		"/JDBOR/DisorderList/Disorder/DisorderFlagList/DisorderFlag/Label/text()", "Flag",
		"/JDBOR/DisorderList/Disorder/DisorderType/Name/text()", "Type"
      ]
  }
}
output {
 stdout { codec => rubydebug }
 elasticsearch {
  index => "diseases-xml"
  hosts => ["localhost:9200"]
  document_id => "%{[id]}"
 }
} 

Et bref, ça bloque comme indiqué au début.
L'idée étant que je souhaiterais faire ce traitement via logstash et ne pas repartir sur un autre parser pour générer du json

ELK en 6.4.2

Je ne sais pas si @colinsurprenant aurait une idée.

Au cas où cela pourrait aider d'une autre manière, j'ai développé un support du XML dans FSCrawler. A tester peut-être selon ton besoin.

Je crois que le problème est tout simplement avec l'option source du xml filter; cette option indique dans quel field du event se situe l'xml à déserialiser. Par défaut source est le field message et il semble bien que ca devrait etre ca car le file input + multiline codec va mettre le résultat de sa lecture dans le field message.

Laissez moi savoir si c'est effectivement le problème ici!
Colin

Ok, merci de votre précieuse aide, ça me paraît logique effectivement, initialement je n'avais pas capté que la source après sortie du codec n'était plus le fichier mais la source du filtre donc "message".

J'essaie ça ASAP et je vous indique le résultat. (BTW, dans "l'urgence" j'ai fini par pré-traiter mes données pour pondre du jscon captable par ELK et en faire quelques vues dans Kibana, mais bien sûr je ne lâche pas l'idée d'avoir un pipeline complet via logstash.)

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.