解析XML文件LogStash

问题描述:

我有以下logstash的conf文件:解析XML文件LogStash

input { 
file 
{ 
    path => "C:\Dashboard\Elmah\*.xml" 
    start_position => "beginning" 
    type => "error" 
    codec => multiline 
    { 
     pattern => "^<\?error .*\>" 
     negate => true 
     what => "previous" 
    } 
    sincedb_path => "C:\Dashboard\Elmah" 
    } 
} 

filter 
{ 
    xml 
    { 
     source => "error" 
     xpath => 
     [ 
      "/error/@errorId", "ErrorId", 
      "/error/@type", "Type", 
      "/error/@message", "Message", 
      "/error/@time", "Time", 
      "/error/@user", "User" 
     ] 
     store_xml => true 
    } 
} 

output 
{ 
    elasticsearch 
    { 
     action => "index" 
     host => "localhost" 
     index => "stock" 
     workers => 1 
    } 
    stdout 
    { 
     codec => rubydebug 
    } 
} 

当我运行斌/ logstash -f agent.conf我没有得到一个错误,但没有数据被插入到Elasticsearch。该文件的一个示例是: https://www.dropbox.com/s/6oni2zhorsdtz6p/error-2015-06-26203423Z-3026bd43-07d6-44d6-a6cf-6d27b28a607e.xml?dl=0

如何让Logstash读取外部xml文件的集合?

LogStash调试输出:

Please see here: https://www.dropbox.com/s/g7g1154uvf9fr1f/outputlog2.txt?dl=0 
+0

你从stdout {}的输出中得到了什么? –

+0

@AlainCollins:我添加了你请求的信息 –

+0

我的意思是你的logstash stdout(你有一个输出节引用它)。 –

我不知道,你可以在这里使用的文件输入 - 我只看到它用于监视文件的变化,而不是监视新文件。除非你的XML文件被更新,否则我不认为它会做任何事情。请记住,logstash通常会监视新的日志行。

大多数人写的工具,如下面的处理在批处理整个文件:

https://github.com/elastic/elasticsearch-river-wikipedia

https://github.com/andrewvc/wikiparse

https://github.com/elastic/stream2es

这些工具,特别是最后一个,似乎更接近你用例。

+0

如果您尝试运行(重复)进行测试,请删除sincedb文件或将路径设置为/ dev/null。 –

+0

@Martin:Stream2es似乎不支持解析xml文件。 –

+0

@AlainCollins:在C:\ Dashboard \ Elmah文件夹中未创建任何文件。我将“sincedb_path”更改为/ dev/null,并再次运行LogStash和ElasticSearch,但得到了相同的结果。 –

我已经成功地使用以下logstash配置来处理每行上包含一个xml文档的文件。希望这个帮助!

input { 
    file { 
     path => "/tmp/logstash/test.log" 
      start_position => "beginning" 
      sincedb_path => "/dev/null" 
    } 
} 

filter { 
    xml { 
     source => "message" 
      force_array => false 
      xpath => [ 
      "/Event/@timestamp", "time", 
      "/Event/user[1]/id[1]/text()", "user", 
      "/Event/user[1]/ip[1]/text()[1]", "ip", 
      "/Event/@eventType", "eventType", 
      "/Event/transactionDuration/text()", "trxDuration", 
      ] 
      store_xml => true 
    } 
} 

output 
{ 
    stdout{ 
     codec => line {  
      format => "%{[time]} %{[user]} %{[eventType]} %{[trxDuration]}" 
     } 
    } 
}