【问题标题】:Segregating and pushing Logs into different indices in elasticsearch using logstash based on loglevels使用基于日志级别的logstash将日志隔离并推送到elasticsearch中的不同索引
【发布时间】:2016-01-06 23:04:11
【问题描述】:

我是 ELK 堆栈的新手,目前我想根据日志级别将日志推送到不同的弹性搜索索引中。例如,假设 logstash-error_logs 索引将仅包含错误日志(日志级别为 ERROR 的日志),logstash-ok_logs 索引将包含所有 INFO 日志()日志,日志级别为 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 日志未路由到所需的索引。

【问题讨论】:

    标签: logging elasticsearch architecture logstash


    【解决方案1】:

    两个想法:

    1. "in" 更多用于标签。试试这个:

      如果 [LOGLEVEL] == "staging.ERROR" { ... }

    2. 而不是重复你的输出节,它们之间的差异很小,设置和使用一个变量(注意:伪代码;我总是把 => 语法弄错):

      如果 [LOGLEVEL] == "staging.ERROR" { 变异{ add_field => { "index_name" => "error" } } }

    然后在你的输出中:

    output {
        elasticsearch {
            hosts => ["localhost:9200"]
            index => "logstash-%{index_name}_logs"
        }
    }
    

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

    希望对您有所帮助。

    【讨论】:

    • 1.我已经尝试过第一种方法,但这不起作用。我不明白为什么即使在日志的 JSON 中有一个 LOGLEVEL 字段后我们也不能这样做 if [LOGLEVEL] == "staging.ERROR" { ... } !!!! 2.你能详细说明第二种方法吗?我的意思是我需要在过滤器 {...} 插件中添加变量???
    • 进一步,在使用第一种方法时,控件也不会进入 else 部分!!!!!!!!!日志没有按照他们应该的那样路由到技术部门,而是路由到我在我的配置文件中没有提到的“logstash-*”索引!!!!!!!!!你能解释一下这种意外行为吗???
    • 在第二种方法中,条件变异将在过滤器块中。它设置一个变量(“index_name”),然后在输出块中引用该变量。
    • 当您看到意外行为时,请在同一目录中查找旧配置文件。 Logstash 将它们全部加载!
    • 每次我对配置文件进行任何更改并重新启动 logstash 时,我都会更改配置文件。那么为什么logstash会加载旧的配置文件???即使可以做些什么来阻止logstash这样做??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2021-08-04
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多