全局改变子索引模式的 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 使用通配符来匹配字段名称。
我有一个 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 使用通配符来匹配字段名称。