Não tenho certeza se você ainda está tendo esse problema, mas se estiver, veja o que funcionará para você.
Dado este formato de registro:
log_format custom '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$host" "$http_x_forwarded_for"';
o padrão de grok que você especificou não leva em consideração a adição da porção "$host" "$http_x_forwarded_for"
.
Não sei por que seu grok não está falhando, mas deveria.
Em qualquer evento, esse padrão funcionará com o formato de registro acima:
%{IP:clientip} %{NOTSPACE:ident} %{NOTSPACE:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer})(?:;|) %{QS:agent} "%{NOTSPACE:host}" "(?<x_forwarded_for>%{IP:xff_clientip}, .*)"
E resulta nos seguintes campos
httpversion 1.1
request /api/filter/14928/content?api_key=apikey&site=website
timestamp 28/Sep/2015:12:39:56·+1000
auth -
host my.website.com
agent "-"
x_forwarded_for 1.144.97.102,·1.144.97.102,·1.144.97.102,·127.0.0.1,·172.31.26.59
clientip 172.31.7.219
bytes 101
response 403
xff_clientip 1.144.97.102
ident -
port
verb GET
referrer
Note que você tem alguns novos campos do que você teria antes.
O primeiro ("x_forward_for" = > 1.144.97.102, 1.144.97.102, 1.144.97.102, 127.0.0.1, 172.31.26.59
) é o conteúdo do último conjunto de citações ou $http_x_forwarded_for
do formato de registro.
O segundo ("xff_clientip" = > 1.144.97.102
) é apenas o primeiro IP dessa lista, que deve ser traduzido para o IP de origem real da solicitação.
Se fosse eu, também executaria o campo x_forwarded_for
por meio de um filtro mutate
para dividi-lo em uma matriz:
mutate {
split => { "x_forwarded_for" => ", " }
}