我已经继承了日志的ELK堆栈,我还在学习绳索 - 我的任务是在我们的logstash索引上为某个类型设置两个字段数字。似乎无法弄清楚如何做到这一点。我试过的事情:
%{NUMBER:response_code}
任何帮助都非常感谢,特别是相关文档的链接,以便我能够理解正在发生的事情。如果我知道要谷歌的话,我会更加苦苦挣扎。
答案 0 :(得分:3)
另请注意,%{NUMBER:response_code}
不会从字符串中生成数字,它只是识别并解析字符串中的数字,但生成的response_code
字段仍然是字符串,您需要使用mutate/convert
filter转换为数字。 grok将始终将字符串解析为其他较小的字符串,将结果字段转换为您期望的类型是您的工作。
所以你需要在你的grok过滤器之后添加它:
mutate {
convert => { "response_code" => "integer" }
}
从那时起,事件中的response_code
将是一个整数,用于创建每日logstash索引的logstash template包含整数字段的特定动态模板。请注意,response_code
字段只有在创建新的logstash索引后才是整数,现有索引不会更改。
答案 1 :(得分:1)
您需要reindex your data。由于此字段的Elasticsearch映射(即架构)已设置为string
,因此您无法将数据索引为同一索引中的integer
。
典型的ELK设置将创建滚动索引(每天或每月),因此可以在索引之间从string
切换到interger
,但不建议这样做,因为它会干扰长期聚合和搜索。
正如您所发现的那样,更改Grok规则将有助于未来的数据。现在,您需要再次通过Logstash传递所有现有数据以应用新的ryles。
要执行此操作,您可以再次传递日志文件,也可以使用
从Elasticsearch读取Logstashinput {
elasticsearch {
hosts => "localhost"
}
}
较新版本的Elasticsearch应通过提供原生reindex
API来改善这一点。
答案 2 :(得分:0)
尝试查看文档样本:
卷曲-XGET' localhost:9200 / _search?q =操作码:userLessonComplexityPoll& pretty'
让我们看看这些文档:
{ " _index" :" myindex", " _type" :" logs", " _id" :" AWNoYI8pGmxxeL6jupEZ", " _score" :1.0, " _source" :{ "生产" :" 0", " lessonId" :" 2144", "操作码" :" userLessonComplexityPoll", " courseId" :" 45", " lessonType" :" minitest", ...
因此,尝试转换一个文档:
curl -XPOST' localhost:9200 / educa_stats - * / _ update_by_query?pretty' -d' { "脚本":{ " lang":"无痛", " source":" if(ctx._source.lessonId instanceof String){int lessonId = Integer.parseInt(ctx._source.lessonId); ctx._source.lessonId =(int)lessonId; }" }, "查询":{ " bool":{ "条款":{ " _id":[" AWNoYI8pGmxxeL6jupEZ"," AWMcRJYFGmxxeL6jucIZ"] } } } }'
成功?尝试通过查询转换所有文档:
curl -XPOST 'localhost:9200/educa_stats-*/_update_by_query?pretty' -d '
{ "脚本":{ " lang":"无痛", " source":" if(ctx._source.lessonId instanceof String){int lessonId = Integer.parseInt(ctx._source.lessonId); ctx._source.lessonId =(int)lessonId; }" }, "查询":{ " bool":{ "必须":[ { "存在":{ " field":" lessonId" } } ] } } }'
所有字段lessonId将从String类型转换为int(-2 ^ 32 - 2 ^ 32)类型。一切都好。