我是ELK堆栈的新手,目前我想根据日志级别推送不同弹性搜索索引的日志。例如,假设logstash-error_logs索引将仅包含错误日志(loglevel为ERROR的日志),logstash-ok_logs索引将包含所有INFO logs()日志,其中loglevel为INFO),依此类推。给定的是我的日志文件的格式:
[2016-01-06 13:29:49] staging.INFO:回调已发送
因此我使用的grok过滤器如下所示:
grok {
match => { "message" => "%{SYSLOG5424SD} %{JAVACLASS:LOGLEVEL}" }
}
这为我在日志的JSON中提供了另一个“LOGLEVEL”字段。使用此字段,我可以使用条件将日志路由到不同的索引,具体取决于日志级别。因此,我在输出过滤器中使用以下代码来相应地路由日志:
output {
if [LOGLEVEL] in ["staging.ERROR"] {
elasticsearch { hosts => ["localhost:9200"]
index => "logstash-error_logs"
}
}
else if [LOGLEVEL] in ["staging.INFO"] {
elasticsearch { hosts => ["localhost:9200"]
index => "logstash-ok_logs"
}
}
else {
elasticsearch { hosts => ["localhost:9200"]
index => "tech"
}
}
stdout { codec => rubydebug }
}
但不幸的是分期。 INFO日志未被路由到所需索引。
答案 0 :(得分:0)
两个想法:
“in”更适用于标签。试试这个:
如果[LOGLEVEL] ==“staging.ERROR”{ ... }
而不是重复你的输出节,它们之间有一点差别,设置并使用一个变量(注意:伪代码;我总是得到=>语法错误):
如果[LOGLEVEL] ==“staging.ERROR”{ 变异{ add_field => {“index_name”=> “错误”} } }
然后在你的输出中:
{{1}}
如果您不希望将“index_name”字段发送到elasticsearch,则可以将其放在@metadata中。
希望有所帮助。