我第一次使用logstash,并且无法确定如何在解析字段上确定索引而不保留它。
这是我的配置文件:
input {
http {
port => 31311
}
}
filter {
json {
source => "message"
}
mutate {
remove_field => [ "headers", "message" ]
}
grok {
match => [ "name", "^(?<metric-type>\w+)\..*" ]
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
index => "%{metric-type}-%{+YYYY.MM.dd}"
}
}
Json示例发送到http
插件:
{
"name": "counter.custom",
"value": 321,
"from": "2017-11-30T10:43:17.213Z",
"to": "2017-11-30T10:44:00.001Z"
}
此记录按预期保存在counter-2017.11.30
索引中。但是,我不希望保存字段metric-type
,我只需要它来确定索引。
有什么建议吗?
答案 0 :(得分:1)
由于grok模式不支持grok
语法,因此我使用metric-type
将[@metadata][metric-type]
放入字段中。我使用mutate
过滤器将该字段复制到@metadata
,然后删除了临时字段。
input {
http {
port => 31311
}
}
filter {
json {
source => "message"
}
mutate {
remove_field => [ "headers", "message" ]
}
grok {
match => [ "name", "^(?<metric-type>\w+)\..*" ]
}
mutate {
add_field => { "[@metadata][metric-type]" => "%{metric-type}" }
remove_field => [ "metric-type" ]
}
}
output {
elasticsearch {
hosts => [ "http://localhost:9200" ]
index => "%{[@metadata][metric-type]}-%{+YYYY.MM.dd}"
}
}
- 编辑 -
正如@Phonolog在讨论中所建议的那样,有一个更简单,更好的解决方案。通过使用grok关键字匹配而不是正则表达式,我能够将捕获的组直接保存到@metadata
。
input {
http {
port => 31311
}
}
filter {
json {
source => "message"
}
mutate {
remove_field => [ "headers", "message" ]
}
grok {
match => [ "name", "%{WORD:[@metadata][metric-type]}." ]
}
}
output {
elasticsearch {
hosts => [ "http://localhost:9200" ]
index => "%{[@metadata][metric-type]}-%{+YYYY.MM.dd}"
}
}