10

我正在使用Grok & Logstash 将访问日志从 Nginx 发送到 Elastic 搜索。我正在向 Logstash 提供我所有的访问日志(使用通配符,效果很好),我想获取文件名(确切地说是其中的一部分)并将其用作字段。

我的配置如下:

input {
  file {
    path => "/var/log/nginx/*.access.log"
    type => "nginx_access"
  }
}

filter {
  if [type] == "nginx_access" {
    grok { 
      match => { "message" => "%{COMBINEDAPACHELOG}" }
      match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" }
      add_field => { "app" => "%{app}" }
    }
  }
}
output{
   # whatever
}

但这似乎不起作用:该app字段已添加,但值为%{app}(未替换)。

我尝试了不同的东西,但无济于事。我可能遗漏了一些东西......有什么想法吗?

非常感谢

4

2 回答 2

15

好的,找到了。grok默认情况下在匹配时中断。所以第一场比赛很好,它跳过了第二场比赛。

我这样解决了:

filter {
  if [type] == "nginx_access" {
    grok { 
      match => { "message" => "%{COMBINEDAPACHELOG}" }
      match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" }
      break_on_match => false
    }
  }
}
于 2014-05-21T12:41:36.140 回答
1

如果日志文件中有不匹配的行,我发现使用 2 个 grok 块更可取。

filter {
  if [type] == "nginx_access" {
    grok { 
      match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" }
    }
    grok { 
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
  }
}
于 2016-06-30T02:39:17.463 回答