Regex 使用grok将日志文件名作为字段添加到logstash中

Regex 使用grok将日志文件名作为字段添加到logstash中,regex,logstash,logstash-grok,Regex,Logstash,Logstash Grok,我使用&Logstash将访问日志从Nginx发送到elasticsearch。我给Logstash我所有的访问日志(使用通配符,效果很好),我想得到文件名(确切地说是其中的一部分)并将其用作字段 我的配置如下: input { file { path => "/var/log/nginx/*.access.log" type => "nginx_access" } } filter { if [type] == "nginx_access" {

我使用&Logstash将访问日志从Nginx发送到elasticsearch。我给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}
(未替换)

我尝试了不同的方法,但没有效果。我可能错过了什么有什么想法吗?


非常感谢

好的,找到了<默认情况下,code>grok在匹配时中断。因此,第一场比赛是好的,它跳过了第二场

我是这样解决的:

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

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

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

我要注意的是,使用logstash forwarder(又名lumberjack)转发的邮件所使用的字段不是
路径
,而是
文件
。其他一切都很完美。