Elasticsearch Logstash Filebeat mapping

У меня проблема с ELK Stack + Filebeat.

Filebeat отправляет логи, похожие на apache, в Logstash, который должен анализировать строки. Elasticsearch должен хранить разделенные данные в полях, чтобы я мог визуализировать их с помощью Kibana.

Проблема: Elasticsearch получает журналы, но сохраняет их в одном поле "сообщения".

Желаемое решение:

Входные данные:

10.0.0.1 some.hostname.at - [27 / Jun / 2017: 23: 59: 59 +0200]

ES:

"Ф": "10.0.0.1"

"Имя хоста": "some.hostname.at"

"отметка времени":"27/ июнь /2017:23:59:59 +0200"

Моя конфигурация logstash:

    input {

  beats {
    port => 5044
  }



}

filter { 


  if [type] == "web-apache" {
        grok {
            patterns_dir => ["./patterns"]
            match => { "message" => "IP: %{IPV4:client_ip}, Hostname: %{HOSTNAME:hostname}, - \[timestamp: %{HTTPDATE:timestamp}\]" }
            break_on_match => false
            remove_field => [ "message" ]
        }

        date {
            locale => "en"
            timezone => "Europe/Vienna"
            match =>  [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
        }

        useragent {
            source => "agent"
            prefix => "browser_"
        }
    }

    }

output {

    stdout {
       codec => rubydebug
    }

    elasticsearch {
             hosts => ["localhost:9200"]
         index => "test1"
             document_type => "accessAPI"
           }
}

Мой Elasticsearch обнаружил вывод:

Поле

Я надеюсь, что есть специалисты ELK, которые могут мне помочь. Заранее спасибо, Матиас

1 ответ

Решение

Фильтр Grok, который вы указали, не будет работать здесь

Попробуйте использовать:

%{IPV4:client_ip} %{HOSTNAME:hostname} - \[%{HTTPDATE:timestamp}\]


Нет необходимости указывать нужные имена отдельно перед именами полей (вы не пытаетесь отформатировать сообщение здесь, а извлекаете отдельные поля), просто указав имя поля в скобках после ":" приведет к результат, который вы хотите.

Кроме того, используйте функцию перезаписи вместо поля remove_field для сообщения. Больше информации здесь:
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

Это будет выглядеть примерно так:

filter {
  grok {
    match => { "message" => "%{IPV4:client_ip} %{HOSTNAME:hostname} - \[%{HTTPDATE:timestamp}\]" }
    overwrite => [ "message" ]
  }
}

Вы можете проверить фильтры grok здесь:
http://grokconstructor.appspot.com/do/match

Другие вопросы по тегам