Logstash Kibana不在filebeat中显示grok过滤器中的字段

Logstash Kibana不在filebeat中显示grok过滤器中的字段,logstash,logstash-grok,Logstash,Logstash Grok,我想在Kibana中显示包含apache日志的日志文件。 日志以IP开头。我已经调试了我的模式,它通过了。 我试图在beats输入配置文件中添加字段,但即使在刷新字段后,这些字段也不会显示在Kibana中。 这是配置文件 filter { if[type] == "apache" { grok { match => { "message" => "%{HOST:log_host}%{GREEDYDATA:remaining}" } add_fiel

我想在Kibana中显示包含apache日志的日志文件。 日志以IP开头。我已经调试了我的模式,它通过了。 我试图在beats输入配置文件中添加字段,但即使在刷新字段后,这些字段也不会显示在Kibana中。 这是配置文件

filter {
  if[type] == "apache" {
    grok {
      match => { "message" => "%{HOST:log_host}%{GREEDYDATA:remaining}" }
      add_field => { "testip" => "%{log_host}" }
      add_field => { "data_left" => "%{remaining}" }
    }
  }
...

只需补充一点,我已经在新配置后重新启动了所有服务:logstash、elasticsearch、kibana。

问题可能是您的
grok
模式使用的模式太死板了

  • 根据
    test\u ip
    字段的名称,
    HOST
    很可能是
    IPORHOST
假设数据实际上是以定义为apache的类型输入的,那么它应该是:

filter {
  if [type] == "apache" {
    grok {
      match => {
        message => "%{IPORHOST:log_host}%{GREEDYDATA:remaining}"
      }
      add_field => {
        testip => "%{log_host}"
        data_left => "%{remaining}"
      }
    }
  }
}
话虽如此,使用
add_字段
是完全没有必要的。
grok
模式本身正在创建两个字段:
log\u host
remaining
,因此不需要定义名为
testip
data\u left
的额外字段

也许更有用的是,您不需要编写自己的Apache web日志
grok
模式,这将自动提供所有标准字段

filter {
  if [type] == "apache" {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
    # Set @timestamp to the log's time and drop the unneeded timestamp
    date {
      match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
      remove_field => "timestamp"
    }
  }
}

您可以在。

FYI中看到这一点,对于这种更改,重新启动非日志存储服务是不必要的。我只运行了%{GREEDYDATA:remaining}测试。这是Kibana中输出的JSON格式:
“_source”:{“message”:“/valid message Here/”,“@version”:“1”,“@timestamp”:“2016-06-21T09:19:12.770Z”,“offset”:406600,“beat”:{“hostname”:/name/”,“name”:/name/“},
剩余的
字段找不到了。我最喜欢的调试日志的方法是将您的消息放入文本文件,然后
cat
将其放入日志:
cat myfile.txt | bin/Logstash-f myconf.conf
。为此,我使用
stdin
输入和
stdout
输出。我猜您的
类型
它不匹配,所以它甚至没有运行。一个简单的测试是删除类型检查,看看会发生什么(可能是grok解析失败)。这是向前迈出的一步。然而,现在我只使用%{IPORHOST}来获取ip字段,但在输出中我得到的正是输入中的内容。如果使用
output{stdout{codec=>rubydebug},输出是什么
?这将显示整个事件,包括任何元字段。