用Logstash解析XML

用Logstash解析XML,logstash,elastic-stack,logstash-configuration,Logstash,Elastic Stack,Logstash Configuration,我是ELK堆栈的anewbie,正在尝试使用Logstash处理下面的示例XML文件 <Book:Body> <Book:Head> <bookname>Book:Name</bookname> <ns:Hello xmlns:ns="www.example.com"> <ns:BookDetails> &

我是ELK堆栈的anewbie,正在尝试使用Logstash处理下面的示例XML文件

<Book:Body>
    <Book:Head>
        <bookname>Book:Name</bookname>
            <ns:Hello xmlns:ns="www.example.com">
                <ns:BookDetails>
                    <ns:ID>123456</ns:ID>
                    <ns:Name>ABC</ns:Name>
                </ns:BookDetails>
        </ns:Hello xmlns:ns="www.example.com">
    </Book:Head>
</Book:Body>
我已确保该文件仅被读取一次


非常感谢您在这方面提供的帮助。使用多行过滤器和XML有点棘手,而且不太稳定。我建议保持简单,确保文件中没有新行,然后尝试使用XML过滤器。

使用多行过滤器和XML有点棘手,而且不太稳定。我建议保持简单,确保文件中没有新行,然后尝试使用XML过滤器。

检查XPath。它没有任何名称空间,请检查XPath。它没有任何名称空间
input{ 
        file{ 
                path =>"/opt/data/book3.xml"
                                codec => multiline { 
                                pattern =>"<Book:Body>" 
                                negate => "true" 
                                what => "previous"} 
        }
} 

filter { 

                xml { 
                        store_xml => "false" 
                        source => "message" 
                        remove_namespaces => "true" 

                       xpath => [ 
                "/Body/Head/Hello/BookDetails/ID/text()", "ID", 
                "/Body/Head/Hello/BookDetails/Name/text()", "Name" 
                ] 
                    } 

                mutate { 
                        add_field => ["IDIndexed", "%{ID}"] 
                        add_field => ["NameIndexed", "%{Name}"] 
                        } 
} 
output{ 
        elasticsearch {hosts=>"localhost"} 
                stdout { codec => rubydebug } 
        }
Starting pipeline {:id=>"main", :pipeline_workers=>1, :batch_size=>125, :batch_delay=>5, :max_inflight=>125, :level=>:info}
Pipeline main started