启用 Grok 规则后,应用程序中的 ELK 日志消失

启用 Grok 规则后,应用程序中的 ELK 日志消失

我们有两个应用程序实例(相同的应用程序,不同的数据库),我们将它们称为 app1 和 app2。日志采用的路由是:

  1. appX 运行 filebeat,它拾取应用程序日志文件并将其标记为 appX,并将每个条目发送到 rabbitmq 集群上的 logstash 实例。然后将其添加到 rabbitmq 中。
  2. 消息穿过 rabbitmq 集群,并被另一个 logstash 实例使用,该实例根据标签运行各种过滤器。
  3. 同一个logstash实例将结果日志行提交给elasticsearch。

一切都很好。在 app1 和 app2 的情况下,过滤器是 grok,它将消息拆分成我们可以搜索的字段。

app1 运行正常,日志经过过滤器处理,并按预期出现在 elasticsearch 中的正确索引中。

app2 不起作用。问题在于 grok 规则,我知道这一点是因为如果我删除针对 app2 运行的 grok 规则,日志会按预期显示。当我取消注释 grok 规则时,app2 的日志不再出现在 elasticsearch 中任何地方

app1 和 app2 的过滤器相同:

filter {
    if "app2" in [tags] {
            mutate {
                    gsub => ["message", "\n", "LINE_BREAK"]
            }
            grok {
                    match => [ "message", "%{TIMESTAMP_ISO8601:time}\s+%{WORD:level}\s+\[%{DATA:thread_name}\]\s+%{DATA:class}\:%{DATA:line} %{DATA:method}\s*-\s*%{DATA:message}$" ]
                    overwrite => [ "message" ]
            }
            date {
                    match => [ "time", "YYYY-MM-dd HH:mm:ss,SSS"]
                    target => "@timestamp"
            }
            mutate {
                    remove_field => [ "time" ]  # Removes the 'time' field                        
            }
    } 
}

我怀疑 elasticsearch 拒绝索引来自 app2 的日志。当然,我检查了 elasticsearch 和 logstash 的日志,但没有报告任何问题。这促使我研究如何在 elasticsearch 中“启动”日志记录。

有人知道如何让 elasticsearch 报告与提取这些日志相关的任何错误吗?或者知道如何在启用 grok 时找出 app2 的日志发生了什么?

我尝试过这个:

    # curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{ 
  "transient": {
"logger._root": "trace" 
 } 
}
'

不出所料,这给了我“火力全开”的感觉,但至少是可以抓取的。标签仅在处理特定日志行时提及。

提前致谢。

关于这一点还有一点:我刚刚运行了 logstash,并设置了 app2 grok 规则,并且启用了过滤器日志记录,如下所示:

# curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d'
{
"logger.logstash.filters.grok" : "ALL"
}'

没有出现任何错误,这进一步证实了我的理论:grok 规则本身是正确的,而 elasticsearch 拒绝索引消息。我也这样做过:

# curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d' 
{
"logger.logstash.outputs.elasticsearch" : "ALL"
} '

验证没有索引错误。虽然没有报告任何错误,但有点令人担忧的是,什么都没有报告,这让我怀疑我是不是找错了方向。

答案1

根据我的经验,当 ES 插入失败时,它会直接将其写入日志中,让可怜的人解码并找出原因。我通常在出现映射问题时才会看到它。要么是类型冲突,要么是文档格式错误。

(这是我没有对 ES 日志进行日志存储的首要原因。当 ES 日志中出现错误的提取时,提取会再次失败,并围绕错误循环运行。此外,在正确的情况下,它是一个 PII 炸弹)

另一个要尝试的故障排除步骤是在 ES 输出旁边设置一个条件输出,以将app1app2事件放入文件中。这样您就可以在它们发送到 ES 的状态下并排查看它们。这可能会揭示一些正在发生的事情的线索。也许其他一些过滤器阶段正在操纵一个。或者可能app2永远不会走到那一步,所以问题出在过滤器和output {}阶段之间。

相关内容