Обработка собственного журнала NGINX с помощью logstash
У меня есть журнал доступа nginx, который регистрирует тело запроса в виде строки json. например.
"{\x0A\x22userId\x22 : \x22MyUserID\x22,\x0A\x22title\x22 : \x22\MyTitle\x0A}"
Моя цель - сохранить эти 2 значения (userId и title) в 2 отдельных полях в Elastic Search.
Моя конфигурация Logstash:
filter {
if [type] == "nginxlog" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG} %{QS:partner_id} %{NUMBER:req_time} %{NUMBER:res_time} %{GREEDYDATA:extra_fields}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
mutate {
gsub => [
"extra_fields", x22 ,'"' ,
"extra_fields",x0A ,'\n'
]
}
json{
source => "extra_fields"
target => "extra_json"
}
mutate {
add_field => {
"userId => "%{[extra_json][userId]}"
"title"=> "%{[extra_json][title]}"
}
}
}
}
Но он извлечен неправильно, значение в ES userId = userId, а не MyUserID. Любая подсказка, где проблема? Или какая-нибудь лучшая идея для достижения того же?