Практика ELK (2): сбор логов Nginx

Elasticsearch

Журнал доступа Nginx

Вот инструкции по использованию журналов доступа Nginx. Как правило, формат необходимо определить в основном файле конфигурации nginx.conf:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for" $request_time';скопировать код

Приведенный выше формат основан на формате по умолчанию, и я добавил один$request_time.

Затем подконфигурация использует:

access_log  logs/myapp.log  main;скопировать код

Вот и все.

Filebeat собирает данные журнала для ElasticSearch

Конфигурация:

su -e elk
cd /usr/local/elk
vim beats/filebeat/filebeat.test_nginx.ymlскопировать код

Детали конфигурации:

filebeat.prospectors:
- type: log
  input_type: log
  paths:
    - /work/yphp/nginx/logs/*.log
  tags: ["ngx", "yujc"]
  fields:
    logIndex: nginx
    docType: nginx-access
  fields_under_root: true
  tail_files: false

output.elasticsearch:
  hosts: ["127.0.0.1:9200"]
  index: "test-nginx-%{+yyyy.MM.dd}"скопировать код

Инструкции по настройке:

filebeat.prospectors:

  • тип тип журнала, журнал по умолчанию
  • input_type тип ввода, журнал по умолчанию
  • Журналы, собранные путями, могут использовать подстановочные знаки. поддерживает несколько
  • tags Пользовательские теги, массив. настроить
  • поля настраиваемые поля
  • fields_under_root Добавляются ли настраиваемые поля к корню. Если false, имя ключа поля конфигурации полей — fields
  • Начинают ли tail_files собирать с конца
  • пользовательское поле document_type, используемое в Logsatsh для различения источников, использование переменных в Logsatshtypeвыражать

output.elasticsearch:

  • хосты настраивают узлы ES, формат массива, поддерживает несколько.
  • index Настроить индекс ES. Не настраивать использовать по умолчанию filebeat-*
  • протокол настроить протокол, например http, https
  • имя пользователя Настройте имя пользователя ES, например, elastic
  • пароль настроить пароль ES, например changeme

Установите права на 600 и запустите файлбит:

chmod -R 600 beats/filebeat/filebeat.test_nginx.yml

./beats/filebeat/filebeat -c beats/filebeat/filebeat.test_nginx.ymlскопировать код

Затем зайдите в приложение Nginx, чтобы узнать, добавил ли ES индекс:


$ curl http://127.0.0.1:9200/_cat/indices?v | grep test-nginx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
105  1161  105  1161    0     0   123k      0 --:--:-- --:--:-- --:--:--  125k
yellow open   test-nginx-2018.09.24             ArxrVVOkTjG8ZlXJjb9bVg   5   1          1            0     11.6kb         11.6kb
скопировать код

Давайте посмотрим на часть данных:

$ curl http://127.0.0.1:9200/test-nginx-2018.09.24/_search?q=*&size=1


{
  "_index": "test-nginx-2018.09.24",
  "_type": "doc",
  "_id": "AWYKkBqtJzfnbYlB_DRX",
  "_version": 1,
  "_score": null,
  "_source": {
    "@timestamp": "2018-09-24T07:51:43.140Z",
    "beat": {
      "hostname": "2106567e5bce",
      "name": "2106567e5bce",
      "version": "5.6.2"
    },
    "docType": "nginx-access",
    "input_type": "log",
    "logIndex": "nginx",
    "message": "172.16.10.1 - - [24/Sep/2018:07:51:40 +0000] \"GET /?time=22 HTTP/1.1\" 200 97991 \"-\" \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\" \"-\" 0.009",
    "offset": 5243,
    "source": "/work/yphp/nginx/logs/hello71.log",
    "tags": [
      "ngx",
      "yujc"
    ],
    "type": "log"
  },
  "fields": {
    "@timestamp": [
      1537775503140
    ]
  },
  "sort": [
    1537775503140
  ]
}скопировать код

Вы видите, что данные уже есть. Но содержимое лога в целом (полеmessage) вверх.

Filebeat собирает данные журнала, фильтрует Logstash и отправляет их в ElasticSearch.

Конфигурация:

su -e elk
cd /usr/local/elk
vim beats/filebeat/filebeat.test_nginx2.ymlскопировать код

Детали конфигурации:

filebeat.prospectors:
- type: log
  input_type: log
  paths:
    - /work/yphp/nginx/logs/*.log
  tags: ["ngx", "yujc"]
  fields:
    logIndex: nginx
    docType: nginx-access
  fields_under_root: true
  tail_files: false

output.logstash:
  hosts: ["127.0.0.1:5044"]скопировать код

Настроить логсташ

su -e elk
cd /usr/local/elk
vim logstash/config/conf.d/filebeat.confскопировать код

Детали конфигурации:

input {
    beats {
        port => 5044
    }
}

filter {
    grok {
        match => { "message" => "%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] \"%{WORD:method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent:bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\" \"%{DATA:x_forwarded_for}\" %{NUMBER:request_time}" }
        remove_field => "message"
    }
}

output {
    elasticsearch {
        hosts => ["127.0.0.1:9200"]
        index => "test-nginx2-%{type}-%{+YYYY.MM.dd}"
        document_type => "%{type}"
    }
    stdout { codec => rubydebug }
}скопировать код

Формат журнала nginx, который я использую, заключается в добавлении 2 полей к стандартному формату.$http_x_forwarded_forа также$request_time:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' 
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';скопировать код

Пример журнала:

172.16.10.1 - - [24/Sep/2018:09:04:40 +0000] "GET /?time=2244 HTTP/1.1" 200 98086 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-" 0.002скопировать код

Приведенное выше выражение grok:

%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] \"%{WORD:method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent:bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\" \"%{DATA:x_forwarded_for}\" %{NUMBER:request_time}скопировать код

мы сначала используемGrok DebuggerВ онлайн-отладке инструмента проверьте правильность написанного grok. Я запустил его без тестирования до этого и обнаружил, что в grok в ES нет анализируемого поля, а затем я увидел вывод filebeat в командной строке (работает на переднем плане):

$ ./beats/filebeat/filebeat -c beats/filebeat/filebeat.test_nginx2.yml

{
    "@timestamp" => 2018-09-24T09:01:19.555Z,
      "logIndex" => "nginx",
        "offset" => 6467,
       "docType" => "nginx-access",
      "@version" => "1",
    "input_type" => "log",
          "beat" => {
            "name" => "2106567e5bce",
        "hostname" => "2106567e5bce",
         "version" => "5.6.2"
    },
          "host" => "2106567e5bce",
        "source" => "/work/yphp/nginx/logs/hello71.log",
       "message" => "172.16.10.1 - - [24/Sep/2018:09:01:14 +0000] \"GET /?time=2244 HTTP/1.1\" 200 98087 \"-\" \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\" \"-\" 0.195",
          "type" => "log",
          "tags" => [
        [0] "ngx",
        [1] "yujc",
        [2] "beats_input_codec_plain_applied",
        [3] "_grokparsefailure"
    ]
}скопировать код

Последний намек_grokparsefailure, что указывает на проблему с частью grok. Поскольку это справочное онлайн-руководство, и я только что с ним столкнулся, я не знаю, как его настроить.. Отладка filebeat.conf заняла много времени, прежде чем он вступил в силу.

мы открытыGrok Debugger, первое поле ввода вводит содержимое исходного поля сообщения сообщения, собранного filebeat, а второе поле ввода вводит выражение grok:

Нажмите кнопку «Перейти», чтобы выполнить анализ. Если следующее{}Объясните, что синтаксический анализ завершился неудачно, затем вы можете изменить выражение, и инструмент проанализирует его автоматически. Окончательный результат разбора:

{
  "remote_ip": [
    [
      "172.16.10.1"
    ]
  ],
  "HOSTNAME": [
    [
      "172.16.10.1"
    ]
  ],
  "IP": [
    [
      null
    ]
  ],
  "IPV6": [
    [
      null
    ]
  ],
  "IPV4": [
    [
      null
    ]
  ],
  "user_name": [
    [
      "-"
    ]
  ],
  "time": [
    [
      "24/Sep/2018:08:47:59 +0000"
    ]
  ],
  "MONTHDAY": [
    [
      "24"
    ]
  ],
  "MONTH": [
    [
      "Sep"
    ]
  ],
  "YEAR": [
    [
      "2018"
    ]
  ],
  "TIME": [
    [
      "08:47:59"
    ]
  ],
  "HOUR": [
    [
      "08"
    ]
  ],
  "MINUTE": [
    [
      "47"
    ]
  ],
  "SECOND": [
    [
      "59"
    ]
  ],
  "INT": [
    [
      "+0000"
    ]
  ],
  "method": [
    [
      "GET"
    ]
  ],
  "url": [
    [
      "/?time=2244"
    ]
  ],
  "http_version": [
    [
      "1.1"
    ]
  ],
  "BASE10NUM": [
    [
      "1.1",
      "200",
      "98086",
      "0.002"
    ]
  ],
  "response_code": [
    [
      "200"
    ]
  ],
  "body_sent": [
    [
      "98086"
    ]
  ],
  "referrer": [
    [
      "-"
    ]
  ],
  "agent": [
    [
      "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
    ]
  ],
  "x_forwarded_for": [
    [
      "-"
    ]
  ],
  "request_time": [
    [
      "0.002"
    ]
  ]
}скопировать код

Затем вы можете запустить logstash.

Проверьте, проходит ли конфигурация logstash:

./logstash/bin/logstash -f logstash/config/conf.d/filebeat.conf --config.test_and_exit

Config Validation Result: OK. Exiting Logstashскопировать код
# 启动logstash
./logstash/bin/logstash &

# 启动filebeat
./beats/filebeat/filebeat -c beats/filebeat/filebeat.test_nginx2.ymlскопировать код

Мы снова посещаем приложение Nginx, а затем просматриваем часть данных:

$ curl http://127.0.0.1:9200/test-nginx2-log-2018.09.24/_search?q=*&size=1&sort=@timestamp:desc

{
  "took": 14,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": null,
    "hits": [
      {
        "_index": "test-nginx2-log-2018.09.24",
        "_type": "log",
        "_id": "AWYK0to8JzfnbYlB_DRx",
        "_score": null,
        "_source": {
          "response_code": "200",
          "agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
          "logIndex": "nginx",
          "offset": 6875,
          "method": "GET",
          "docType": "nginx-access",
          "user_name": "-",
          "input_type": "log",
          "http_version": "1.1",
          "source": "/work/yphp/nginx/logs/hello71.log",
          "message": """172.16.10.1 - - [24/Sep/2018:09:04:40 +0000] "GET /?time=2244 HTTP/1.1" 200 98086 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-" 0.002""",
          "type": "log",
          "url": "/?time=2244",
          "tags": [
            "ngx",
            "yujc",
            "beats_input_codec_plain_applied"
          ],
          "x_forwarded_for": "-",
          "referrer": "-",
          "@timestamp": "2018-09-24T09:04:40.404Z",
          "remote_ip": "172.16.10.1",
          "request_time": "0.002",
          "@version": "1",
          "beat": {
            "name": "2106567e5bce",
            "hostname": "2106567e5bce",
            "version": "5.6.2"
          },
          "host": "2106567e5bce",
          "body_sent": "98086",
          "time": "24/Sep/2018:09:04:40 +0000"
        },
        "sort": [
          1537779880404
        ]
      }
    ]
  }
}скопировать код

Он содержит все поля, которые мы проанализировали.

Посмотреть в кибане

Откройте веб-адрес kibana: http://127.0.0.1:5601 и откройте последовательно:Management
-> Kibana -> Index Patterns,выберитеCreate Index Pattern:

A. Ввод шаблона индекса:test-nginx2-*;

b. Выбор имени поля фильтра времени@timestamp.

в) Нажмите «Создать».

Затем откройте Discover и выберите filebeat-*, чтобы просмотреть данные журнала.

Подробные поля можно увидеть:

Ссылаться на

1. Logstash использует grok для фильтрации логов nginx (2) - Orgliny - Blog Park
https://www.cnblogs.com/Orgliny/p/5592186.html
2. Построение сервиса логов Rsyslog - K'e0llm - Blog Park
http://www.cnblogs.com/Eivll0m/p/6700828.html
3. Как обрабатывать сопоставление данных с ElasticSearch в Logstash — Cocowool — Blog Park
https://www.cnblogs.com/cocowool/p/7347069.html
4. Установка Logstash и Filebeat и настройка архитектуры ELK - Cricket in the pastoral - Blog Park
http://www.cnblogs.com/xishuai/p/elk-logstash-filebeat.html
5. Создайте платформу анализа журналов ELK (ниже) — создайте сервер kibana и logstash — ноль бактерий — Блог 51CTO
http://blog.51cto.com/zero01/2082794

 

Заявление об авторских правах: Перепечатка или специальное заявление не указываются как оригинальная работа автора. В этой статье используется следующее соглашение для авторизации,Бесплатная перепечатка — некоммерческая — не производная — сохранить авторство | Creative Commons BY-NC-ND 3.0, просьба указывать автора и источник при перепечатке.

Автор: Feihongying~

Источник:http://52fhy.cnblogs.com/


рекомендовать! Всего за 2,50 доллара в месяц вы можете получить VPS с SSD!




[рекомендовать]Redis Deep Adventure: основные принципы и практика применения

Чистая сушка! Краткое изложение практики Redis в крупных интернет-компаниях в сочетании с практическими задачами для подробного объяснения внутреннего механизма Redis!