Тема: Elasticsearch Logstash Kibana (AWS)

Есть такой замечательный сервис, можно и самому поднять, дело вкуса и финансов.

what-is-amazon-elasticsearch-service

Так вот, задача с балансеров и веб серверов собрать статистику, и что-то с ней сделать. Например проанализировать. Вся статистика это nginx access/error лог и haproxy модифицированный лог.

Как настраивать ELK не рассматриваю, все описано хорошо у AWS если брать как сервис и тут elastic guide если делать у себя. Приступаем сразу к отправки логов в ELK. Для этого я использую Filebeat

cat /etc/filebeat/filebeat.yml
filebeat:
  prospectors:
    - tags:
        - haproxy
      paths:
        - /var/log/haproxy.log
      pipeline: haproxy
      input_type: log
      fields_under_root: true
      fields:
        document_type: syslog

output:
  elasticsearch:
    hosts: ["https://elk:443"]

logging:
  to_syslog: true
  to_files: false
  level: warning

"pipeline: haproxy" появилось в новых версиях, ingest, раньше получающий сервис парсил все что приходит, теперь надо указать по какому правилу должен проходить данный лог в grok фильтре.

Лог у меня не стандартный и мне надо только 2 IP

Nov  3 12:52:49 group-lb-1 haproxy[574]: 1.1.1.1 2.2.2.2 [03/Nov/2017:12:52:49.088] http~ backend_main/server-1 6/0/1/7/14 200 169 - - ---- 16/16/0/1/0 0/0 "GET /api/aaa HTTP/1.1"

Для этого создаем и по API закачиваем все фильтры на сервер

curl -XPUT 'https://elk:443/_ingest/pipeline/haproxy?pretty' -H 'Content-Type: application/json' -d'
{
  "description" : "haproxy grok",
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": [
          ".*haproxy.*: (%{IP:client_ip1}(:[0-9]+)? (%{IP:client_ip2}|-)?.*|.*)"
        ]
      }
    }
  ]
}
'
curl -XPUT 'https://elk:443/_ingest/pipeline/nginx?pretty' -H 'Content-Type: application/json' -d'
{
  "description" : "nginx grok",
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": [
          "%{IPORHOST:nginx.access.remote_ip} - %{DATA:nginx.access.user_name} \\[%{HTTPDATE:nginx.access.time}\\] \"%{WORD:nginx.access.method} %{DATA:nginx.access.url} HTTP/%{NUMBER:nginx.access.http_version}\" %{NUMBER:nginx.access.response_code} %{NUMBER:nginx.access.body_sent.bytes} \"%{DATA:nginx.access.referrer}\" \"%{DATA:nginx.access.agent}\""
        ]
      }
    }
  ]
}
'

Еще можно много чего сделать по тому же API

Удалить индекс
curl -XDELETE 'https://elk:443/filebeat-*'
Положить
curl -XPUT 'https://elk:443/_template/filebeat' -d@/etc/filebeat/filebeat.template.json
Посмотреть
curl -XGET 'https://elk:443/*?pretty'
curl -XGET 'https://elk:443/filebeat-2017.11.03/_search?pretty'
curl -XGET 'https://elk:443/_ingest/pipeline/haproxy?pretty'

Все, проверяем

curl -XGET 'https://elk:443/filebeat-2017.11.03/_search?q=tags:haproxy&pretty'
...
      {
        "_index" : "filebeat-2017.11.03",
        "_type" : "doc",
        "_id" : "AV-BNurLw3Lo4q9lqhOD",
        "_score" : 4.569596,
        "_source" : {
          "offset" : 5005488,
          "input_type" : "log",
          "source" : "/var/log/haproxy.log",
          "message" : "Nov  3 09:29:35 ... HTTP/1.1\"",
          "type" : "log",
          "client_ip1" : "1.1.1.1",
          "client_ip2" : "2.2.2.2",
          "tags" : [
            "haproxy"
          ],
          "@timestamp" : "2017-11-03T09:29:35.911Z",
          "beat" : {
            "hostname" : "group-lb-1",
            "name" : "group-lb-1",
            "version" : "5.6.3"
          },
          "document_type" : "syslog"
        }
...

Добавлено: 19-12-2017 12:02:26

Elasticsearch Logstash Kibana (NON-AWS)