使用基于日志级别的logstash将日志分隔并推送到elasticsearch中的不同索引

时间:2016-01-06 08:18:40

标签: logging elasticsearch architecture logstash

我是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日志未被路由到所需索引。

1 个答案:

答案 0 :(得分:0)

两个想法:

  1. “in”更适用于标签。试试这个:

    如果[LOGLEVEL] ==“staging.ERROR”{     ... }

  2. 而不是重复你的输出节,它们之间有一点差别,设置并使用一个变量(注意:伪代码;我总是得到=>语法错误):

    如果[LOGLEVEL] ==“staging.ERROR”{     变异{         add_field => {“index_name”=> “错误”}     } }

  3. 然后在你的输出中:

    {{1}}

    如果您不希望将“index_name”字段发送到elasticsearch,则可以将其放在@metadata中。

    希望有所帮助。