全局改变子索引模式的 Logstash 配置

Logstash configuration to globally mutate sub index patterns

我有一个 ELK 堆栈,其中包含一些已配置的索引模式。作为内部要求的一部分,我需要将 json 对象(它是该索引模式的一部分)全局编辑为“字符串”。 截至目前,此类 json 对象由许多子字段随机填充,例如“日期”、“临时工”等。 所有这些都由ELK自动管理,但我需要将它们全部处理并转换(转换)为“字符串”。

所以,基本配置如下:

type A: "long"
type B: "int"
type C: "string"
type D: "json object"

其中类型 D 是一个嵌套的 json 对象,它包括(作为子字段)许多其他索引模式和字段,例如(例如)“typeD.date”、“typeD.temps” ”、“typeD.extrastuff”等。

我需要将所有“typeD*”对象转换为字符串。 到目前为止,我尝试将 .conf 与 logstash 一起使用,但没有成功。我将在(多次)尝试后粘贴我的配置。我在自己的本地 docker 环境中尝试了所有这些配置。

我从中测试 logstash 的日志称为 log_file.json,它包含许多示例行,还包括我想使用此变异操作全局编辑的索引模式。

input {
    file{
      type => "json"
      path => "/home/container/logstash/log_file.json"
      start_position => "beginning"
      sincedb_path => "/dev/null"
      codec => json
  }
}

filter {
   if [message] =~ /\A\{.+\}\z/ {
     json {
       source => "message"
    }

  json {
    source => "[message][typeD]"
}

  mutate {
    convert => ["typeD.*","string"]
}
  }
}

output {
  elasticsearch {
    hosts => "http://localhost:9200"
    index => "logstash-test-%{+yyyy.MM.dd}"
 }
  stdout{}
}

另外,通过 Kibana 登录后,我可以看到 logstash 已正确创建和加载 (conf) 文件,但它仍然无法将索引模式转换为字符串。

我需要知道哪些编辑是配置工作所必需的。 logstash 配置文件是否需要编辑?设置有问题吗?

谢谢

您不能像 convert => ["typeD.*","string"] 那样进行通配符变异。您将不得不编写一个带有递归函数的 ruby 过滤器来遍历 [typeD] 的所有内容。像

    ruby {
        code => '
            def stringify(object, name, event)
                if object == nil
                    event.set(name, "nil" )
                elsif object.kind_of?(Hash) and object != {}
                    object.each { |k, v| stringify(v, "#{name}[#{k}]", event) }
                elsif object.kind_of?(Array) and object != []
                    object.each_index { |i|
                        stringify(object[i], "#{name}[#{i}]", event)
                    }
                else
                    event.set(name, object.to_s)
                end
            end
            stringify(event.get("typeD"), "[typeD]", event)
        '
    }

就是说,如果您要将数据发送到弹性搜索,您最好在弹性搜索中使用 dynamic template 使用通配符来匹配字段名称。