elasticsearch 日志存储分割根消息
我正在收集有关我的应用程序的一些指标,并定期通过REST逐个导出它们。输出json如下所示:elasticsearch 日志存储分割根消息,elasticsearch,logstash,elasticsearch,Logstash,我正在收集有关我的应用程序的一些指标,并定期通过REST逐个导出它们。输出json如下所示: { "name": "decoder.example.type-3", "value": 2000, "from": 1517847790049 "to": 1517847840004 } 这是我的logstash配置,运行良好。它将删除所有http头、原始计数器名称,并将示例添加为接口和类型3添加为事务 input { http { port =>
{
"name": "decoder.example.type-3",
"value": 2000,
"from": 1517847790049
"to": 1517847840004
}
这是我的logstash
配置,运行良好。它将删除所有http头、原始计数器名称,并将示例
添加为接口
和类型3
添加为事务
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
}
]
我很确定我应该使用过滤器,但我不知道如何使用它。我尝试在我的json
插件前后放置split
,使用不同的field
设置,target
s,但似乎没有任何效果
有人能给我指出正确的方向吗 在我的配置中,我首先使用了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}"
}
}
但这假定您总是有一个消息字段作为数组。哦,是的,我想你应该检查一下新的
消息字段是否包含你发布的对象。因为如果是这样,您的grok将无法在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}"
}
}
这帮了大忙。。。我会在最后公布我所做的,这有点复杂,但这帮助我朝着正确的方向前进。谢谢