Шаблон Nginx Grok для logstash

Ниже приведен мой формат журнала Nginx.

log_format timed_combined '$ http_x_forwarded_for - $ remote_user [$ time_local]' '"$ request" $ status $ body_bytes_sent' '"$ http_referer" "$ http_user_agent"' '$ request_time $ upstream_response_time $ pipe';

Ниже приводится запись журнала Nginx (для справки).

- - test.user [26/May/2017:21:54:26 +0000] "POST /elasticsearch/_msearch HTTP/1.1" 200 263 "https://myserver.com/app/kibana" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" 0.020 0.008 .

Ниже приведен шаблон logstash grok.

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - - \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NUMBER:request_time} %{NUMBER:upstream_time}

В журнале регистрации обнаружена ошибка

"status" => 400, "error" => {"type" => "mapper_parsing_exception", "reason" => "не удалось проанализировать [временную метку]", "called_by" => {"type" => "незаконный_аргумент_exception" , "reason" => "Неверный формат: \" 26 / May / 2017: 19: 28: 14 -0400 \ "неверно сформирован в \" / May / 2017: 19: 28: 14 -0400 \ "

Issue: - Nginx logs are not getting grokked. 
Requirement: - Timestamp should be filtered into a particular field.

Что не так в моей конфигурации? Как исправить эту ошибку?


person Ashik Mohammed    schedule 26.05.2017    source источник


Ответы (2)


Предоставленная вами строка журнала не соответствует шаблону NGINXACCESS grok по умолчанию из-за двух отличий:

  1. В качестве первого элемента в строке журнала ожидается IP-адрес или имя хоста, но в строке журнала первым элементом является тире (-).
  2. Третий элемент в строке журнала - это имя пользователя, но в шаблоне grok ожидается тире (-)

Итак, есть два способа решить эту проблему:

  1. Убедитесь, что ваши строки журнала соответствуют шаблону по умолчанию
  2. Измените шаблон Grok на что-то вроде этого:

NGINXACCESS - - %{USERNAME:username} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NUMBER:request_time} %{NUMBER:upstream_time}

Я предлагаю использовать отладчик Grok для разработки и отладки шаблонов Grok. Это позволяет вам создавать и тестировать их постепенно.

person breml    schedule 29.05.2017
comment
Я изменил шаблоны Grok с помощью отладчика Grok. Теперь фильтр Grok соответствует журналу. Но по-прежнему возникает та же ошибка. called_by = ›{type =› незаконный_аргумент_exception, причина = ›Неверный формат: \ 29 / May / 2017: 22: 53: 37 -0400 \ неверно сформирован в \ / May / 2017: 22: 53: 37 -0400 \ @breml - person Ashik Mohammed; 30.05.2017
comment
Я не думаю, что эта ошибка вызвана шаблоном grok, а другой частью вашей конфигурации Logstash. Таким образом, без дальнейших подробностей, будет невозможно ответить на ваш вопрос относительно вышеупомянутой ошибки. - person breml; 30.05.2017
comment
Я пробовал те же конфигурации на свежем тестовом сервере. Работает нормально. Итак, я думаю, что переиндексация эластичного поиска сработает в этом случае. Эти конфликты начались после того, как я изменил шаблоны журнала Nginx (добавлен параметр для исходного IP-адреса клиента и добавлено время ответа). Как вы думаете, это может быть причиной данной ошибки? - person Ashik Mohammed; 30.05.2017

Здесь шаблон для файлов nginx access.log и error.log.

filter {

############################# NGINX ##############################
  if [event][module] == "nginx" {

########## access.log ##########
    if [fileset][name] == "access" {
      grok {
        match => { "message" => ["%{IPORHOST:ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\""] }
        remove_field => "message"
      }
      date {
        match => ["time", "dd/MMM/YYYY:HH:mm:ss Z"]
        target => "@timestamp"
        remove_field => "time"
      }
      useragent {
        source => "agent"
        target => "user_agent"
        remove_field => "agent"
      }
      geoip {
        source => "ip"
        target => "geoip"
      }
    }

########## error.log ##########
    else if [fileset][name] == "error" {
      grok {
        match => { "message" => ["%{DATA:time} \[%{DATA:log_level}\] %{NUMBER:pid}#%{NUMBER:tid}: (\*%{NUMBER:connection_id} )?%{GREEDYDATA:messageTmp}"] }
        remove_field => "message"
      }
      date {
        match => ["time", "YYYY/MM/dd HH:mm:ss"]
        target => "@timestamp"
        remove_field => "time"
      }

      mutate {
        rename => {"messageTmp" => "message"}
      }
    }

    grok {
      remove_field => "[event]"
    }

    mutate {
      add_field => {"serviceName" => "nginx"}
    }
  }

}

person Anton    schedule 04.05.2021