Как отправлять логи nginx в ELK в формате JSON?

#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