chemtech
@chemtech
Линуксойд, DevOps

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

Имеется лог форма 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",'
  '}';


server {
    listen 80;
    server_name service-dev.mycompany.io;
    access_log syslog:server=10.233.60.114:5140 apatsev;


С помощью ngrep вижу
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 находится внутри поля message.

Хотя бы как удалить строку
<190>Mar 19 10:40:07 dev-int-load-balancer2 nginx:
перед JSON ?
  • Вопрос задан
  • 1387 просмотров
Пригласить эксперта
Ответы на вопрос 1
ivankomolin
@ivankomolin
<190>Mar 19 10:40:07 dev-int-load-balancer2 nginx:
Указанную строку формирует syslog в который вы направили вывод логов nginx
Копать в сторону rsyslog templates
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы