Используйте grok для добавления имени файла журнала в качестве поля в logstash

Я использую Грок & Logstash для отправки журналов доступа из Nginx в Elastic search. Я даю 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} (не заменил).

Я пробовал разные вещи, но безрезультатно. Возможно, я что-то упускаю ... какие идеи ?

Спасибо большое

2 ответов


хорошо, нашел. grok перерывы на матч по умолчанию. Так что, если первый матч хороший, он пропускает второй.

Я решил это так :

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

Я нашел более желательным использовать 2 блока grok, если в файлах журнала будут строки unmatching.

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