1

概括:

我正在使用 Logstash - Grok 和弹性搜索,我的主要目的是首先通过 logstash 接受日志,通过 grok 解析它们并根据日志类型将标签与消息相关联,然后最后将其提供给 Elastic 服务器用 Kibana 查询。

我已经编写了此代码,但无法在 Elastic Search 中获取标签。这是我的logstash confif 文件。

input {
  stdin {
    type => "stdin-type"
  }
}
filter {
  grok {
    tags    => "mytags"
    pattern => "I am a %{USERNAME}"
    add_tag => "mytag"
    named_captures_only => true
  }
}
output {
  stdout { debug => true debug_format => "json"}
  elasticsearch {}
}

我哪里错了?

4

2 回答 2

3

1)我会首先编辑您的值以匹配它们所代表的数据类型。例如

     add_tag => "mytag"

实际上应该有一个数组作为它的值,而不是一个简单的字符串。将其更改为

     add_tag => ["mytag"]

作为一个好的开始。仔细检查您的所有值并验证它们的类型是否适用于 logstash。

2)您将 grok 过滤器限制为已根据配置行标记为“mytags”的消息

    tags => "mytags"

我没有看到您提前添加了该标签的任何地方。因此,您的任何消息都不会通过您的 grok 过滤器。

3) 请仔细阅读logstash 文档。我对 Logstash/Grok/ES/Kibana 等世界也很陌生,但是我遇到的问题与您遇到的问题非常相似,所有这些问题都通过注意文档中的内容得到了解决。

于 2013-05-17T12:28:30.170 回答
2

您可以手动运行 LogStash(您可能已经这样做了),/opt/logstash/bin/logstash -f $CONFIG_FILE并且可以检查您的配置文件是否有效,/opt/logstash/bin/logstash -f $CONFIG_FILE --configtest但我敢打赌您已经这样做了。

可能需要将您的add_tag节放入一个数组中

grok {
    ...
    add_tag => [ "mytag" ]
}

也可能是您输入STDIN的内容与 grok 模式不匹配。如果 grok 不匹配,则应_grokparsefailure其添加到您的标签中。如果你看到这些,这意味着你的 grok 模式没有触发。

更好的方法可能是......

input {
  stdin {
    type => 'stdin'
  }
}
filter {
  if [type] = 'stdin' {
    mutate {
     add_tag => [ "mytag" ]
    }
  }
}
output {
  stdout {
    codec => 'rubydebug'
  }
}

这将为"mytag"来自标准输入的所有事物添加一个标签,无论它们是否被摸过。

于 2014-09-19T19:02:31.583 回答