#elasticsearch #nginx #logstash #elastic-stack
#elasticsearch #nginx #logstash #elastic-stack
Вопрос:
Есть форма журнала nginx:
log_format apatsev escape=json
'{'
'"body_bytes_sent":"$body_bytes_sent",'
'"bytes_sent":"$bytes_sent",'
'"request_length":"$request_length",'
'"server_port":"$server_port",'
'"status":"$status",'
'}';
Конфигурация Nginx:
server {
listen 80;
server_name service-dev.mycompany.io;
access_log syslog:server=10.233.60.114:5140 apatsev;
С помощью ngrep (tcpdump) смотрите:
U 10.2.53.165:38051 -> 10.233.60.114:5140 #18
<190>Mar 19 10:40:07 dev-int-load-balancer2 nginx: {"body_bytes_sent":"81","bytes_sent":"257","request_length":"520","server_port":"80","status":"200",}
logstash.conf:
input {
syslog {
host => "0.0.0.0"
port => 5140
type => "log"
}
}
filter {
grok {
match => [ "message" , "%{COMBINEDAPACHELOG} %{GREEDYDATA:extra_fields}"]
overwrite => [ "message" ]
}
geoip {
source => "clientip"
}
mutate {
convert => ["response", "integer"]
convert => ["bytes", "integer"]
convert => ["responsetime", "float"]
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
}
useragent {
source => "agent"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "apatsev-nginx-%{ YYYY.MM.dd}"
}
}
Если отправка не в формате JSON, поле ELK реагирует.
Если вы отправляете JSON, весь JSON находится внутри поля сообщения.
По крайней мере, как удалить строку
<< < 190 > Mar 19 10: 40: 07 dev-int-load-balancer 2 nginx:
до JSON?
Комментарии:
1. Вот полный пример, который не использует JSON, я бы предпочел это, поскольку он более компактный. Но вы также могли бы использовать анализатор json в logstash. Кстати, другой вариант — использовать logfiles и filebeat, это немного более надежно. rzetterberg.github.io/nginx-elk-logging.html