Когда с нашими приложениями дела идут плохо — как они иногда делают, нравится нам это или нет — наши файлы журналов, как правило, являются одними из первых мест, куда мы идем, когда начинаем процесс устранения неполадок.Большое «но» здесь заключается в том, что, несмотря на тот факт, что файлы журналов содержат множество полезной информации о событиях, их обычно чрезвычайно трудно расшифровать.
Современная среда веб-приложений состоит из нескольких источников журналов, которые вместе выводят тысячи строк журнала, написанных на неразборчивом машинном языке. Если, например, у вас настроен стек LAMP, то вам нужно пройти через журналы PHP, Apache и MySQL. Добавьте журналы системы и среды в бой — вместе с журналами, специфичными для фреймворка, такими как журналы Laravel, — и вы получите бесконечную кучу машинных данных.
Поговорим о иголке в стоге сена.
Стек ELK ( Elasticsearch , Logstash и Kibana ) быстро становится самым популярным способом решения этой проблемы. По словам Elastic, самая популярная платформа для анализа журналов с открытым исходным кодом — 500 000 загрузок в месяц — ELK — отличный способ централизовать журналы из нескольких источников, определять корреляции и выполнять глубокий анализ данных.
Elasticsearch — это поисково-аналитический движок, основанный на Apache Lucene, который позволяет пользователям искать и анализировать большие объемы данных практически в реальном времени. Logstash может принимать и пересылать журналы из любого места в любое место. Kibana — это симпатичное лицо стека — пользовательский интерфейс, который позволяет легко запрашивать, визуализировать и исследовать данные Elasticsearch.
В этой статье описывается, как настроить ELK Stack в локальной среде разработки, пересылать журналы веб-сервера (в данном случае журналы Apache) в Elasticsearch с помощью Logstash, а затем анализировать данные в Kibana.
Установка Java
Для стека ELK требуется Java 7 и выше (поддерживаются только Java Oracle и OpenJDK), поэтому в качестве начального шага обновите систему и выполните следующее:
sudoapt-getinstall default-jre
Установка ELK
Существует множество способов установки стека ELK — вы можете использовать Docker, Ansible, Vagrant, Microsoft Azure, AWS или размещенное решение ELK — просто сделайте свой выбор. Существует огромное количество руководств и руководств, которые помогут вам на этом пути, одним из которых является это руководство по стекамELK, которое мы на Logz.io собрали вместе.
Установка Elasticsearch
Мы собираемся начать процесс установки с установки Elasticsearch. Существуют различные способы настройки Elasticsearch, но мы будем использовать Apt.
Сначала загрузите и установите открытый ключ подписи Elastic:
Elasticsearch теперь установлен. Прежде чем мы перейдем к следующим компонентам, мы немного подправим файл конфигурации:
sudonano /etc/elasticsearch/elasticsearch.yml
Некоторые общие конфигурации включают ограничение внешнего доступа к Elasticsearch, поэтому данные не могут быть взломаны или удалены через HTTP API:
network.host: localhost
Теперь вы можете перезапустить Elasticsearch:
sudoservice elasticsearch restart
Чтобы убедиться, что Elasticsearch работает правильно, запросите следующий URL-адрес с помощью команды cURL:
sudocurl'http://localhost:9200'
Вы должны увидеть следующий вывод в вашем терминале:
{"name":"Jebediah Guthrie","cluster_name":"elasticsearch","version":{"number":"2.3.1","build_hash":"bd980929010aef404e7cb0843e61d0665269fc39","build_timestamp":"2016-04-04T12:25:05Z","build_snapshot":false,"lucene_version":"5.5.0"},"tagline":"You Know, for Search"}
Для запуска службы при загрузке выполните:
sudo update-rc.d elasticsearch defaults 95 10
Установка Logstash
Logstash, «L» в «ELK Stack», используется в начале конвейера журналов, принимает и собирает данные перед отправкой в Elasticsearch.
Чтобы установить Logstash, добавьте определение хранилища в файл /etc/apt/sources.list :
echo"deb http://packages.elastic.co/logstash/2.2/debian stable main"|sudotee -a /etc/apt/sources.list
Обновите систему, чтобы репозиторий был готов к использованию, а затем установите Logstash:
sudoapt-get update &&sudoapt-getinstall logstash
Мы вернемся к Logstash позже, чтобы настроить доставку журналов в Elasticsearch.
Установка Кибана
Последняя часть головоломки — Kibana — красивое лицо стека ELK. Сначала создайте список источников Kibana:
echo"deb http://packages.elastic.co/kibana/4.5/debian stable main"|sudotee -a /etc/apt/sources.list
Вы можете получить доступ к Kibana в своем браузере по адресу http://localhost:5601/ (измените URL, если вы используете виртуальную машину типа Homestead Improved для того, какой хост / порт вы настроили):
Чтобы начать анализ журналов в Кибане, необходимо определить хотя бы один шаблон индекса. Индекс — это то, как Elasticsearch организует данные, и его можно сравнить с базой данных в мире RDBMS с отображением, определяющим несколько типов.
Вы заметите, что, поскольку мы еще не отправили какие-либо журналы, Kibana не может получить сопоставление (как показано серой кнопкой в нижней части страницы). Мы позаботимся об этом в следующие несколько шагов.
Совет: по умолчанию Kibana подключается к экземпляру Elasticsearch, работающему на локальном хосте, но вы можете подключиться к другому экземпляру Elasticsearch. Просто измените URL-адрес Elasticsearch в файле конфигурации Kibana, который вы редактировали ранее, а затем перезапустите Kibana.
Доставка журналов
Наш следующий шаг — настроить конвейер журналов в Elasticsearch для индексации и анализа с использованием Kibana. Существуют различные способы пересылки данных в Elasticsearch, но мы собираемся использовать Logstash.
Файлы конфигурации Logstash написаны в формате JSON и находятся в /etc/logstash/conf.d . Конфигурация состоит из трех разделов плагина: вход, фильтр и выход.
Создайте файл конфигурации с именем apache-logs.conf :
sudovi /etc/logstash/conf.d/apache-logs.conf
Наша первая задача — настроить секцию ввода, которая определяет, откуда берутся данные.
В этом случае мы собираемся определить путь к нашему журналу доступа Apache, но вы можете ввести путь к любому другому набору файлов журналов (например, путь к журналам ошибок PHP).
Однако перед тем, как сделать это, я рекомендую немного изучить поддерживаемые входные плагины и узнать, как их определить.В некоторых случаях рекомендуются другие средства пересылки журналов, такие как Filebeat и Fluentd .
Плагины фильтров позволяют нам брать наши необработанные данные и пытаться понять их. Одним из таких плагинов является Grok — плагин, используемый для получения структуры из неструктурированных данных. Используя grok, вы можете определить поиск и извлечь часть ваших строк журнала в структурированные поля.
filter { if [type] == "apache-access" { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } }
Последний раздел файла конфигурации Logstash — это раздел «Вывод», который определяет местоположение, куда отправляются журналы. В нашем случае это наш локальный экземпляр Elasticsearch на нашем локальном хосте:
output { elasticsearch {} }
Вот и все. Как только вы закончите, запустите Logstash с новой конфигурацией:
Обновите Kibana в своем браузере, и вы заметите, что шаблон индекса для наших журналов Apache был идентифицирован:
Нажмите кнопку « Создать» , а затем выберите вкладку «Обнаружение»:
С этого момента Logstash настраивает журнал доступа Apache для сообщений, чтобы любые новые записи были перенаправлены в Elasticsearch.
Анализировать логи
Теперь, когда наш трубопровод запущен, пришло время повеселиться.
Чтобы было немного интереснее, давайте смоделируем шум на нашем веб-сервере. Для этого я собираюсь скачать несколько примеров журналов Apache и вставить их в журнал доступа Apache. Logstash уже следит за этим журналом, поэтому эти сообщения будут проиндексированы в Elasticsearch и отображены в Kibana:
Поиск — это хлеб с маслом из стека ELK, и это искусство само по себе. В Интернете доступно большое количество документации, но я подумал, что смогу охватить все необходимое, чтобы у вас была прочная база для начала геологоразведочных работ.
Давайте начнем с нескольких простых поисков.
Самый простой поиск — это поиск по «свободному тексту», который выполняется по всем проиндексированным полям. Например, если вы анализируете журналы веб-сервера, вы можете выполнить поиск для определенного типа браузера (поиск выполняется с помощью широкого поля поиска в верхней части страницы):
Chrome
Важно отметить, что поиск в свободном тексте НЕ учитывает регистр, если вы не используете двойные кавычки, и в этом случае результаты поиска показывают точное совпадение с вашим запросом.
“Chrome”
Далее идут поиски на уровне поля.
Для поиска значения в определенном поле необходимо добавить имя поля в качестве префикса к значению:
type:apache-access
Скажем, например, что вы ищете конкретный ответ веб-сервера. Введите response:200 чтобы ограничить результаты теми, которые содержат этот ответ.
Вы также можете искать диапазон в поле. Если вы используете скобки [], результаты будут включительно. Если вы используете фигурные скобки {}, результаты исключат указанные значения в запросе.
Теперь пришло время заняться этим на ступеньку выше.
Следующие типы поиска включают использование логических операторов. Они интуитивно понятны, но требуют некоторого изящества, потому что они чрезвычайно чувствительны к синтаксису.
Эти операторы включают использование логических операторов AND, OR и NOT:
type:apache-access AND (response:400 OR response:500)
В приведенном выше поиске я ищу журналы доступа Apache с ответом 400 или 500. Обратите внимание на использование скобок в качестве примера того, как могут быть построены более сложные запросы.
Доступно еще много вариантов поиска (для получения дополнительной информации я рекомендую обратиться к руководству Logib.io по Kibana ), например регулярные выражения, нечеткие поиски и поиски близости, но как только вы определили необходимые данные, вы можете сохранить поиск на будущее. ссылка и в качестве основы для создания визуализаций Kibana.
Визуальное
Одной из наиболее ярких особенностей стека ELK в целом и Kibana в частности является возможность создавать красивые визуализации с использованием данных. Затем эти визуализации можно объединить в сводную панель, которую можно использовать для получения полного представления обо всех различных файлах журнала, поступающих в Elasticsearch.
Чтобы создать визуализацию, выберите вкладку «Визуализация» в Kibana:
Есть несколько типов визуализации, которые вы можете выбрать, и какой тип вы выберете, будет сильно зависеть от цели и конечного результата, которого вы пытаетесь достичь. В этом случае я собираюсь выбрать хорошую старую круговую диаграмму.
Затем у нас есть другой выбор — мы можем создать визуализацию либо из сохраненного поиска, либо из нового поиска. В этом случае мы идем с последним.
Наш следующий шаг — настроить различные метрики и агрегаты для осей X и Y графа. В этом случае мы будем использовать весь индекс в качестве базы поиска (не вводя поисковый запрос в поле поиска), а затем сопоставим данные с типом браузера: Chrome, Firefox, Internet Explorer и Safari:
Как только вы закончите, сохраните визуализацию. Затем вы можете добавить его на пользовательскую панель инструментов на вкладке «Панель инструментов» в Kibana.
Визуализации — это невероятно богатые инструменты, и они — лучший способ понять тенденции в ваших данных.
Вывод
Стек ELK становится способом анализа и управления журналами. Тот факт, что стек является открытым исходным кодом и поддерживается сильным сообществом и быстрорастущей экосистемой, способствует его популярности.
DevOps — не единственная сфера анализа логов, и ELK используется разработчиками, системными администраторами, SEO-экспертами и маркетологами. Разработка на основе журналов — процесс разработки, при котором код отслеживается с использованием метрик, оповещений и журналов — набирает обороты во все большем количестве научно-исследовательских групп, и не будет большой натяжкой связывать это с растущей популярностью ELK ,
Конечно, ни одна система не является идеальной, и есть недостатки, которые пользователи должны избегать, особенно при работе с большими производственными операциями. Но это не должно удерживать вас от попыток, особенно потому, что существует множество источников информации, которые помогут вам в этом процессе.