[英]Logstash split root message
我正在收集有关我的应用程序的一些指标,并定期通过REST逐一导出它们。 输出json看起来像:
{
"name": "decoder.example.type-3",
"value": 2000,
"from": 1517847790049
"to": 1517847840004
}
这是我的logstash
配置,效果很好。 它将删除所有http标头,原始计数器名称,并将example
添加为interface
并将type-3
为transaction
。
input {
http {
port => 31311
}
}
filter {
json {
source => "message"
}
grok {
match => [ "name", "decoder.%{WORD:interface}.%{NOTSPACE:transaction}" ]
}
mutate {
remove_field => [ "name", "headers", "message" ]
}
}
output {
elasticsearch {
hosts => [ "http://localhost:9200" ]
index => "metric.decoder-%{+YYYY.MM.dd}"
}
}
我现在想要做的是立即将所有指标作为json数组发送,并拆分所有这些消息,并一一对应地应用应用于它们的相同逻辑。 输入消息的示例如下所示:
[
{
"name": "decoder.example.type-3",
"value": 2000,
"from": 1517847790049,
"to": 1517847840004
},
{
"name": "decoder.another.type-0",
"value": 3500,
"from": 1517847790049,
"to": 1517847840004
}
]
我可以肯定我应该使用分割过滤器,但是我不知道该如何使用它。 我曾尝试使用不同的field
设置target
放置json
插件前后的split
,但似乎没有按预期工作。
有人可以指出我正确的方向吗?
在我的配置中,我首先使用split,然后执行逻辑。 您的外观应基于以下内容:
input {
http {
port => 31311
}
}
filter {
json {
source => "message"
}
split{
field => "message"
}
grok {
match => [ "name", "decoder.%{WORD:interface}.%{NOTSPACE:transaction}" ]
}
mutate {
remove_field => [ "name", "headers", "message" ]
}
}
output {
elasticsearch {
hosts => [ "http://localhost:9200" ]
index => "metric.decoder-%{+YYYY.MM.dd}"
}
}
但这假定您始终有一个消息字段,它是一个数组。
哦,是的,我想您应该检查message
字段是否包含您发布的对象。 因为如果是这样,您的骗子将无法在name
下找到任何内容,因此您需要匹配message.name
。 (我通常从[message][name]
创建一个temp
字段,以后再删除temp
因为我不在乎查找如何调用嵌套字段。必须有一个更聪明的方法。)
这是我最终得到的配置。 也许可以用更少的步骤来完成,但是效果很好。 我不得不移动一些字段以保持相同的结构,所以它比我最初工作的一个字段大一点。
基本思想是将已解析的json放入特定字段(而不是根目录)中,然后拆分该新字段。
input {
http {
port => 31311
}
}
filter {
json {
source => "message"
target => "stats"
}
split {
field => "stats"
}
grok {
match => [ "[stats][name]", "decoder.%{WORD:interface}.%{NOTSPACE:transaction}" ]
}
mutate {
add_field => {
"value" => "%{[stats][value]}"
"from" => "%{[stats][from]}"
"to" => "%{[stats][to]}"
}
remove_field => [ "headers", "message", "stats" ]
}
mutate {
convert => {
"value" => "integer"
"from" => "integer"
"to" => "integer"
}
}
}
output {
elasticsearch {
hosts => [ "http://localhost:9200" ]
index => "metric.decoder-%{+YYYY.MM.dd}"
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.