【问题标题】:Parsing XML file using Logstash使用 Logstash 解析 XML 文件
【发布时间】:2018-02-09 16:41:33
【问题描述】:

我正在尝试在 Logstash 中解析 XML 文件。我想使用 XPath 来解析 XML 中的文档。所以当我运行我的配置文件时,数据会加载到elasticsearch,但这不是我想要加载数据的方式。 elasticsearch中加载的数据是xml文档中的每一行

我的 XML 文件的结构

我想要达到的目标:

在 elasticsearch 中创建字段来存储以下内容

ID =1
Name = "Finch"

我的配置文件:

input{
    file{
        path => "C:\Users\186181152\Downloads\stations.xml"
        start_position => "beginning"
        sincedb_path => "/dev/null"
        exclude => "*.gz"
        type => "xml"
    }
}
filter{
    xml{
        source => "message"
        store_xml => false
        target => "stations"
        xpath => [
            "/stations/station/id/text()", "station_id",
            "/stations/station/name/text()", "station_name"
        ]
    }
}

output{
    elasticsearch{
        codec => json
        hosts => "localhost"
        index => "xmlns"
    }
    stdout{
        codec => rubydebug
    }
}

Logstash 中的输出:

{
    "station_name" => "%{station_name}",
    "path" => "C:\Users\186181152\Downloads\stations.xml",
    "@timestamp" => 2018-02-09T04:03:12.908Z,
    "station_id" => "%{station_id}",
    "@version" => "1",
    "host" => "BW",
    "message" => "\t\r",
    "type" => "xml"
}

【问题讨论】:

  • 我认为 Windows 不支持 dev/null
  • 整个 xml 文件是否在同一行,即没有换行符?因为如果不是这种情况,文件将被逐行处理(如文档中所示),从而导致空的station_idstation_name
  • @baudsp Dev/null 工作正常。我尝试了一个 csv 文件,它正确加载了数据
  • @baudsp 整个 xml 文件不在同一行。该文件遵循标准 xml 文件约定。一行一个标签
  • 文件输入逐行读取,每行创建一条消息,解释您的结果。您必须在输入中使用多行编解码器。看到这个stackoverflow.com/questions/34800559/…

标签: elasticsearch logstash logstash-configuration


【解决方案1】:

多行过滤器允许将 xml 文件创建为单个事件,我们可以使用 xml-filter 或 xpath 来解析 xml 以在 elasticsearch 中摄取数据。 在多行过滤器中,我们提到了一个模式(在下面的示例中),logstash 使用它来扫描您的 xml 文件。一旦模式与之后的所有条目匹配,则将被视为单个事件。

以下是我的数据的工作配置文件示例

input {
    file {
        path => "C:\Users\186181152\Downloads\stations3.xml"
        start_position => "beginning"
        sincedb_path => "/dev/null"
        exclude => "*.gz"
        type => "xml"
        codec => multiline {
            pattern => "<stations>" 
            negate => "true"
            what => "previous"
        }
    }
}

filter {
    xml {
        source => "message"
        store_xml => false
        target => "stations"
        xpath => [
            "/stations/station/id/text()", "station_id",
            "/stations/station/name/text()", "station_name"
        ]
    }
}

output {
    elasticsearch {
        codec => json
        hosts => "localhost"
        index => "xmlns24"
    }
    stdout {
        codec => rubydebug
    }
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多