1. Setup program logs ELK

 

Настройка  отправки логов в ELK для  анализа и визуализации логов! 

Данный опус является частью единого цикла заметок o CLI.  Для его написания использовалось множество различных источников (скилы крутых специалистов, статьи с тематических сайтов, техническая документация, комментарии с форумов и социальных сетей и т. д и т. п.).  К сожалению, указать все источники точно не представляется  возможным!  По этому,  в конце заметки,  будет указана ссылка только  на основной источник.  Материалы,  использованные для написания заметки, изменялись автором под конкретную задачу! Вам, скорее всего, тоже  придется поступить аналогичным образом для получения желаемого результата) 

 

Нужна консультация или помощь в решении IT вопроса? Пожалуйста, в таком случае  заполните форму запроса на Sytes.ru!

В статье предполагается, что сервер терминалов уже прошел предварительную настройку и работает. Все скриншоты соответствуют Windows Server 2016.

Подразумевается, что для настройки системы анализа логов у Вас уже есть одина или несколько настроеных нод:

Для ознакомления с Kibana можно использовать тестовый набор данных:

 

 

 

 

Установка filebeat

Beats - часть инфраструктуры Elasticsearch, так называемые Data Shippers (поставщики данных). Это легковесные агенты, которые берут данные из различных источников и преобразуют их для передачи в Elasticsearch. Функциональность Beats частично дублирует Logstash, но Beats легковеснее, проще настраиваются, быстрее работают и не требуют установки Java stack. Обычно на нодах, где формируются логи, устанавливаются соответствующие агенты Beats, которые передают логи в Logstash. Logstash аггрегирует, трансформирует логи и передает их в Elasticsearch. Существует множество разных Beats, в стандартный набор входят следующие агенты:

  • Filebeat - сбор логов из различных log-файлов.
  • Packetbeat - сбор сетевой статистики.
  • Winlogbeat -  сбор логов на платформе Windows.
  • Metricbeat - сбор разнообразных метрик.
  • Heartbeat - сбор данных о доступности инфраструктуры.
  • Auditbeat - сбор данных аудита систем.
  • Functionbeat - сбор данных с Serverless проектов (AWS Lambda).
  • Journalbeat - сбор логов Journald.

Наиболее распространен агент Filebeat, используем его для сбора логов Nginx. 

  1. Установите Filebeat:
root@ubuntu:~# apt-get install filebeat
  1. Разрешите обработку логов Nginx:
root@ubuntu:~# mv /etc/filebeat/modules.d/nginx.yml.disabled /etc/filebeat/modules.d/nginx.yml

Если логи находятся в нестандартном месте, либо требуется обработка только части логов, в файле /etc/filebeat/modules.d/nginx.yml раскомментируйте и заполните переменные var.paths. 

В примере далее будем собирать и анализировать логи обращения к сервису Kibana. При настройке Nginx мы определили, что логи обращений будут храниться в файлах /var/log/nginx/kibana.access.log  и /var/log/nginx/kibana.error.log.

  1. Приведите файл /etc/filebeat/modules.d/nginx.yml к следующему виду:
# Module: nginx
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.4/filebeat-module-nginx.html

- module: nginx
# Access logs
access:
enabled: true

# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths:
- /var/log/nginx/kibana.access.log

# Error logs
error:
enabled: true

# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths:
     - /var/log/nginx/kibana.error.log 
  1. В файле /etc/filebeat/filebeat.yml отредактируйте секцию setup.kibana:
setup.kibana:
  host: "<IP-адрес сервера с Kibana>:5601"
  username: "логин"
  password: "<пароль>"

Примечание

Логин и пароль требуются для доступа Filebeat в Kibana с целью загрузки типовых dashboard под известные наборы данных.

  1. Логи будут пересылаться в Logstash, поэтому закомментируйте секцию output.elasticsearch и укажите IP-адрес сервера, на котором расположен Logstash, в секции output.logstash:
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
# Array of hosts to connect to.
# hosts: ["localhost:9200"]

# Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme"

#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
hosts: ["<IP-адрес сервера logstash>:5044"]

# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]

# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"

# Client Certificate Key
  #ssl.key: "/etc/pki/client/cert.key"
  1. Убедитесь, что в конфигурационном файле нет ошибок:
root@ubuntu:/etc/filebeat# filebeat test config -c /etc/filebeat/filebeat.yml
Config OK

Перед запуском Filebeat настройте прием логов в Logstash.

Настройка Logstash

Конфигурационный файл Logstash в общем виде состоит из трех секций:

  • input - описание пункта назначения логов.
  • filter - трансформация логов.
  • output - описание пункта назначения преобразованных логов.
  1. Создайте файл /etc/logstash/conf.d/input-beats.conf, содержащий номер порта, на который Beats (в частности, Filebeat) присылает свои логи:
input {
beats {
port => 5044
}
}
  1. Создайте файл /etc/logstash/conf.d/output-elasticsearch.conf и укажите, что логи нужно отправлять в Elasticsearch по адресу localhost и индексы нужно именовать в формате nginx-<дата> (то есть каждый день будет создаваться новый индекс, это удобно для анализа):
output {
elasticsearch {
hosts => [ "localhost:9200" ]
        manage_template => false
        index => "nginx-%{+YYYY.MM.dd}"
    }
}
  1. Создайте файл /etc/logstash/conf.d/filter-nginx.conf следующего содержания:
filter {
 if [event][dataset] == "nginx.access" {
   grok {
    match => [ "message" , "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:user_agent}"]
    overwrite => [ "message" ]
   }
   mutate {
    convert => ["response", "integer"]
    convert => ["bytes", "integer"]
    convert => ["responsetime", "float"]
   }
  geoip {
   source => "clientip"
   target => "geoip"
   add_tag => [ "nginx-geoip" ]
  }
  date {
   match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
   remove_field => [ "timestamp" ]
  }
  
  useragent {
   source => "user_agent"
  }
 }
}

Filebeat, который будет пересылать логи Nginx в Logstash, записывает всю строчку лога Nginx  в поле message. Поэтому это поле нужно разобрать на переменные, с которыми можно будет работать в Elasticsearch. Этот разбор осуществляется в секции grok в формате NGINX ACCESS LOG .

В секции mutate можно изменить формат хранения данных (например, чтобы поле bytes из лога хранилось как число, а не как строка).

В секции geoip к логу добавляются поля геолокации по IP-адресу запроса.

Секция date используется для парсинга поля даты запроса из лога и преобразование для передачи в Elasticsearch.

Секция  useragent заполняет поля по полю из лога. Обратите внимание, что обычно в подобных руководствах используется поле agent. Это поле не будет работать в связке Filebeat + Logstash, так как оно предназначено для использования при прямой записи из Filebeat в Elasticsearh. При использовании в Logstash будет выдаваться ошибка:

[2019-11-19T09:55:46,254][ERROR][logstash.filters.useragent][main] Uknown error while parsing user agent data {:exception=>#<TypeError: cannot convert instance of class org.jruby.RubyHash to class java.lang.String>, :field=>"agent", :event=>#<LogStash::Event:0x1b16bb2>}

По той же причине в секции  grok match не нужно использовать макрос %{COMBINEDAPACHELOG}. 

Для отслеживания ошибок в Logstash включите дебаг. Для этого в секцию output добавьте следующую строку:

stdout { codec => rubydebug }

В результате вывод в базу Elasticsearch будет дублироваться выводом на консоль/syslog. Кроме того, для проверки выражений grok match полезно использовать Grok Debugger.

  1. Запустите Logstash и добавьте его в список приложений для автоматического запуска:
root@ubuntu:~# systemctl start logstash
root@ubuntu:~# systemctl enable logstash
Created symlink /etc/systemd/system/multi-user.target.wants/logstash.service → /etc/systemd/system/logstash.service.
  1. Убедитесь, что сервис запустился:
root@ubuntu:~# netstat -tulpn | grep 5044
tcp6       0      0 :::5044                 :::\*                    LISTEN      18857/java  
  1. Протестируйте работу Filebeat:
root@ubuntu:~# service filebeat start

Настройка Kibana Templates

После запуска Filebeat логи обращения к Kibana поступают в Logstash, затем в Elasticsearch. Чтобы просмотреть эти логи, в Kibana необходимо настроить templates.

  1. Перейдите в Kibana, в левом меню нажмите шестеренку, выберите Kibana > Index Patterns и нажмите Create Index Pattern.

 

 

  1. Чтобы выбрать все записи, в поле Index pattern введите nginx-*  и нажмите Next step.

 

 

  1. Чтобы использоваться временные метки из лог-файлов, в поле Time Filter field name выберите @timestamp и нажмите Create index pattern.

 

 

 Будет создан index pattern.

 

 

Чтобы просмотреть логи, попавшие в Elasticsearch, перейдите в Discover.

Настройка Kibana Visualizations

Dashboard в Kibana состоит из визуализаций. Визуализация - это разновидность графика, построенного по определенным запросам из Elasticsearch.

Построим первую визуализацию  - топ 10 клиентов.

  1. В левом меню выберите Visualisations и нажмите кнопку Create new visualisation.

 

 

  1. Выберите Vertical bar.

 

 

  1. Выберите темплейт nginx-*.
  2. Добавьте ось X.

 

 

  1. Введите данные:
  • Aggregation: Terms - возвращает указанное количество топ-значений.
  • Field: clientip.keyword - выбираем клиента по IP-адресу.
  • Size: 10 - 10 топ значений.
  • Custom Label: Top 10 clients - название визуализации.

 

 

  1. Выполните запрос и сохраните визуализацию.

 

 

В результате на визуализации показаны топ-10 IP-адресов, с которых были обращения.

Построим вторую визуализацию - круговую диаграмму, показывающую топ 5 стран, откуда обращались пользователи. 

  1. В левом меню выберите Visualisations и нажмите кнопку Create new visualisation.
  2. Выберите Pie.
  3. Выберите темплейт nginx-*.
  4. Добавьте ось X.
  5. Чтобы данные отображались секторам, выберите Add bucket / Split slices.

 

 

  1. Введите следующие данные:
  • Aggregation: Terms - выбираем топ значения данных.
  • Field: geoip.country_code2.keyword - двухбуквенное обозначение страны.
  • Size:5  - выбираем топ 5.
  • Custom label: Top 5 countries -  название графика.

 

 

  1. Выполните запрос и сохраните визуализацию.

 

 

На графике отобразятся топ 5 стран, из которых был доступ.

Построим третью визуализацию - график количества запросов, с делением по кодам ответа. 

  1. В левом меню выберите Visualisations и нажмите кнопку Create new visualisation.
  2. Выберите TSVB.
  3. Выберите темплейт nginx-*.
  4. Чтобы получить все коды ответов сервера (то есть все запросы, отправленные серверу), в появившемся окне впишите в название Requests, выберите группировать по фильтру и в строке запроса укажите responce:*.
  5.  Для добавления второй линии на график, .
  6. Чтобы на втором графике получить выборку количества ответов сервера "200 ОК" в единицу времени, нажмите "+", выберите другой цвет, в названии укажите Responce:200, в строке запроса - responce:200. 
  7. Нажмите "+" и аналогичным образом добавьте код ответа 302. Затем сохраните визуализацию.

 

 

Настройка Kibana Dashboard

Kibana Dashboard - это набор визуализаций.

  1. Нажмите Dashboards, затем Create New Dashboard.

 

 

  1. В верхнем меню нажмите Add.

 

 

  1. В открывшемся окне выберите созданные вами визуализации.

 

 

  1. При необходимости измените порядок и размер визуализаций, затем нажмите Save.

 

Источник:

https://mcs.mail.ru/docs/additionals/cases/cases-logs/case-logging

Конец! 

 

  • ELK, filebeat, Kibana Templates
  • 0 Пользователи нашли это полезным
Помог ли вам данный ответ?

Связанные статьи

0. Install stack ELK

Установка и настройка ELK для сбора, анализа и визуализации логов!  Данный опус...