当前位置: 首页 > 面试题库 >

Logstash,来自多个文档中xml文件的split事件,保留来自根标签的信息

葛念
2023-03-14
问题内容

我的问题:我的XML文件包含要使用Logstash解析的事件,然后再使用Kibana对其进行请求。我想在每个事件中保留来自ROOT标记的所有信息。

输入看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT number="34">
  <EVENTLIST>
    <EVENT name="hey"/>
    <EVENT name="you"/>
  </EVENTLIST>
</ROOT>

我想要的是两个这样的文件:

{
  "number":"34"
  "name": "Hey"
}
{
  "number":"34"
  "name": "you"
}

Logstash conf:

input {
  stdin { }
}
filter {
  xml {
    store_xml => "false"
    source => "message"
    target => "EVENT"
    xpath => [
      "/ROOT/@number","number",
      "/ROOT/EVENTLIST/EVENT/@name","name"
    ]
  }
}
output { elasticsearch { host => localhost } stdout { codec => rubydebug } }

没有工作。我得到的是:

{
  "number" : ["34"]
  "name":["hey,"you""]
}

我遵循了这篇文章的解决方案:https :
//serverfault.com/questions/615196/logstash-parsing-xml-document- contains-
multiple-log-entries

但是我的问题仍然存在,我丢失了根标签的信息。

解决方案之一可能是使用一些红宝石过滤器来处理该问题,但我不知道红宝石。另一种方法是使用一些Java程序将XML转换为JSON,然后再将其发送到elasticsearch

有什么想法可以解决这个问题,还是我必须学习红宝石?


问题答案:

如果您的结构很简单,则可以使用memorize我编写的插件。

您的配置如下所示:

filter {
  if ([message] =~ /<ROOT/) {
    grok {
      match => [ "message", 
        'number="(?<number>\d+)" number2="(?<number1>\d+)"'
      ] 
    }
  } else if ([message] =~ /<EVENT /) {
    grok { 
      match => [ "message", 'name="(?<name>[^"]+)"']
    }
  }
  memorize {
    fields => ["number","number1"]
  }
  if ([message] !~ /<EVENT /) {
    drop {}
  } else {
    mutate { remove_field => ["message"] }
  }
}

我的示例显示了ROOT根据下面的注释在元素中查找多个内容。这是支持记忆多个字段的插件版本:

# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"
require "set"
#
# This filter will look for fields from an event and record the last value
# of them.  If any are not present, their last value will be added to the
# event
#
# The config looks like this:
#
#     filter {
#       memorize {
#         fields => ["time"]
#         default => { "time" => "00:00:00.000" }
#       }
#     }
#
# The `fields` is an array of the field NAMES that you want to memorize
# The `default` is a map of field names to field values that you want
# to use if the field isn't present and has no memorized value (optional)

class LogStash::Filters::Memorize < LogStash::Filters::Base

  config_name "memorize"
  milestone 2

  # An array of the field names to to memorize
  config :fields, :validate => :array, :required => true
  # a map for default values to use if its not seen before we need it
  config :default, :validate => :hash, :required => false

  # The stream identity is how the filter determines which stream an
  # event belongs to. See the multiline plugin if you want more details on how
  # this might work
  config :stream_identity , :validate => :string, :default => "%{host}.%{path}.%{type}"

  public
  def initialize(config = {})
    super

    @threadsafe = false

    # This filter needs to keep state.
    @memorized = Hash.new
  end # def initialize

  public
  def register
    # nothing needed
  end # def register

  public
  def filter(event)
    return unless filter?(event)

    any = false
    @fields.each do |field|
      if event[field].nil?
    map = @memorized[@stream_identity]
        val = map.nil? ? nil : map[field]
        if val.nil?
          val = @default.nil? ? nil : @default[field]
        end
    if !val.nil?
          event[field] = val
          any = true
    end
      else
        map = @memorized[@stream_identity]
    if map.nil?
          map = @memorized[@stream_identity] = Hash.new
    end
    val = event[field]
    map[field] = event[field]
      end #if
      if any
        filter_matched(event)
      end
    end #field.each
  end
end

对于logstash 1.5和更高版本,可以通过以下方式安装此插件

bin/plugin install logstash-filter-memorize


 类似资料:
  • 我是java世界的新手,我需要生成一个。xml文件,该文件来自。xsd文件 我做了一些研究,发现“jaxb”可以做到这一点。我也找到了一些例子,但问题是,几乎所有的例子都使用“xjc”工具来实现这一点。但我想通过java代码实现这一点。 O这可能吗? 如果是,我在想这样的事情,从我的java代码 加载. xsd文件 生成. xml 保存. xml文件 有人能告诉我一个好的资源,或者告诉我我的想法是

  • 我想让我的discord.js bot能够给出一个用户提供的id的信息,但我不能让它工作。我尝试使用guild#fetchuser(id),但它只是返回未定义的。即使它工作,我将需要用户,对成员类,例如,能够给出基本信息(创建于...)即使是在公会之外的用户。这是我的代码: 我想如何从ID中找到用户名和所有用户属性?谢谢:) 更新我发现我可以使用taggedUser=bot.users.fetch

  • 请快速帮助我从jnlp文件下载jar文件,在缓存中下载的文件是随机命名的,而不是按照jnlp文件名,即它有像345546ACB-1DA47A98-1_2_3_4这样的名称,而不是jarone.jar,请使用正确的URL我需要用于下载下面代码的jar或如何获得在缓存文件夹中下载的jar文件的正确名称。我可以在java控制台中看到所有正确的jar名称,但不能从那里下载

  • 问题内容: 我试图将来自多个文件的所有测试合并到一个文件中,如下所示: 我很确定这不是参加测试的最佳方式,我很难找到如何执行此操作的示例: 问题答案: 如果你想包含多个模块 到 您的层次结构就像你在你的问题做什么,你在做什么是相当多的 它 ,除非你想要写摩卡自定义测试装载机。编写自定义加载器不会比已有代码容易或使代码更清晰。 这是我将如何更改某些事情的示例。本示例中的子目录组织为: : 该功能只是

  • 我在这方面遇到了很多麻烦。我定义了构造函数,我可以让它导入一个文档,但不是两个。我得到的错误是: 有了一个include,Snakeyaml很高兴找到一个EOF并处理导入。有了两个,就不开心了(上图)。 我的java源代码是: 问题是,有没有人对蛇蟹做过类似的事情?有没有想过我做错了什么?

  • 问题内容: 持续获取以下警告消息。不知道该怎么办。看到一些相关的帖子要求增加文件描述符的数量。 怎么做呢? 即使现在增加,在添加新索引时也会遇到同样的问题。(目前使用约400个索引,6个分片和1个副本)。指数的数量往往会增加。 节点api的输出 问题答案: 如何增加允许打开的文件的最大数量取决于您的Linux发行版。以下是有关ubuntu和centos的一些说明: http://posidev.c