我正在从Logstash插入ElasticSearch。我的问题是我在ES中使用了一个模板来布局数据类型,有时我从ES中声明它们应该为 double 值时,会从Logstash获取值为空值(或破折号)的值。
因此有时候,ES得到的是'-'而不是诸如“2342”之类的东西,并且拒绝它并导致错误。现在,如果我可以将“-”替换为“null”,那么ES可以正常工作。
我该怎么做呢?我认为它可以与 ruby 过滤器一起使用。我需要能够在适当的时候用空值替换'-'字段。
编辑:
我被要求提供示例配置。
因此,例如,说下面的配置是logstash,它将随后将数据发送到ES:
filter {
if [type] == "transaction" {
match => ["message", "%{BASE16FLOAT:ts}\t%{IP:orig_ip}\t%{NOTSPACE:orig_port}" ]
}
}
现在我的ES模板说:
"transaction" : {
"properties" :
{
"ts" : {
"format" : "dateOptionalTime",
"type" : "date"
},
"orig_ip" : {
"type" : "ip"
},
"orig_port" : {
"type" : "long"
},
}
}
因此,如果我抛出上述任何一个数据集,它将通过:
{"ts" : "123456789.123234", "orig_ip" : "10.0.0.1", "orig_port" : "2342" }
{"ts" : "123456789.123234", "orig_ip" : "10.0.0.1", "orig_port" : null }
我成功了但是,以下[显然]失败了:
{"ts" : "123456789.123234", "orig_ip" : "10.0.0.1", "orig_port" : "-" }
如何确保将“-”(带引号)更改为null?
最佳答案
如果您通过在"ignore_malformed": true
orig_port
字段中指定long
来修改模板,则模板应该可以使用。
"transaction" : {
"properties" :
{
"ts" : {
"format" : "dateOptionalTime",
"type" : "date"
},
"orig_ip" : {
"type" : "ip"
},
"orig_port" : {
"type" : "long"
"ignore_malformed": true <---- add this line
}
}
}
关于replace - 如何替换Logstash中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31869232/