Просмотр архивных логов apache c помощью Logstash+Elastisearch+Kibanа

в 18:27, , рубрики: Apache, elasticsearch, kibana, logs, logstash, системное администрирование, метки: , , , ,

Приветствую.

Нет так давно передо мной встала задача пробежаться по старым логам apache. Надо было сделать выборку по нескольким IP адресам, отыскать некоторые аномалии и попытки SQL-injection'ов. Логов было не так много, порядка миллиона строк и можно было спокойно всё сделать стандартным набором grap-awk-uniq-wc итд.

Поскольку я уже какое-то (больше года) время пользуюсь связкой Logstash-Elasticsearch-Kibana для анализа-просмотра всевозможных логов, то решил ей воспользоваться и в данной ситуации.

Краткое описание основных компонентов системы.

Logstash — бесплатная open-source программа на java для сбора и нормализации логов. Может принимать логи либо с локальных файлов, либо через tcp/udp порты. На момент написания статьи разных входных (input) фильтров насчитывается 26. Есть даже входной модуль, для сбора сообщений из twitter'а или irc.

Elasticsearch — бесплатный open-source поисковый сервер основанный на Apache Lucene. Быстрый, легко настраиваемый и очень масштабируемый.

Kibana — веб-интерфейс написанный на ruby, для отображения данных из Elasticsearch. Простая настройка, но множество функций — поиск, графики, stream.

1. Elasticsearch

1.1 Скачиваем Elasticsearch (размер 16MB):
Важно заметить, что для Logstash версии 1.1.9 Elasticsearch должен быть именно версии 0.20.2.
# wget http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.2.tar.gz

1.2 Распаковываем файл:
# tar -zxf elasticsearch-0.20.2.tar.gz
Желающие поразить окружающих могут добавить ключ «v» :)

1.3 По большому счёту можно запускать Elasticsearch и с заводскими настройками. Но я всё же меняю некоторые параметры.
Заходим любимым текстовым редакторов в файл настроек:
# vi elasticsearch-0.20.2/config/elasticsearch.yml

Список моих изменений для standalone решения:

cluster.name: logs
index.number_of_replicas: 0
path.data: /elasticsearch/elasticsearch-0.20.2/data
path.work: /elasticsearch/elasticsearch-0.20.2/work
path.logs: /elasticsearch/elasticsearch-0.20.2/logs
bootstrap.mlockall: true
discovery.zen.ping.multicast.enabled: false

Перед запуском Elasticsearch убедитесь, что каталоги прописанные в path.data, path.work и path.logs существуют.

1.4 Запускаем Elasticsearch в foreground режиме, что бы удостовериться, что сервер корректно работает:
# ./bin/elasticsearch -f
Если видим строку подобную этой, значит сервер запустился

[2013-01-11 1151:35,160][INFO ][node                     ] [Virgo] {0.20.2}[17620]: started

1.5 Для запуска Elasticsearch в фоновом (daemon) режиме достаточно убрать ключ "-f"
# ./bin/elasticsearch

Если на вашем сервере появились два tcp порта 9200 и 9300 в режиме LISTEN, то это значит Elasticsearch готов к работе.

2. Logstash

2.1 Скачиваем свежую версию Logstash 1.1.9 (размер 63MB)
# wget https://logstash.objects.dreamhost.com/release/logstash-1.1.9-monolithic.jar

2.2 Создаём конфигурационный файл (apache.conf) для принятия архивных логов apache, их нормализации и занесением в базу Elasticsearch:

input {
  tcp {
    type => "apache-access"
    port => 3338
  }
}
filter {
  grok {
    type => "apache-access"
    pattern => "%{COMBINEDAPACHELOG}"
  }
  date {
    type => "apache-access"
    timestamp => "dd/MMM/yyyy:HH:mm:ss Z"
  }
}
output {
  elasticsearch {
    embedded => false
    cluster => logs
    host => "172.28.2.2"
    index => "apache-%{+YYYY.MM}"
    type => "apache-access"
    max_inflight_requests => 500
  }
}

Краткое описание некоторых параметров:

port => 3338

В нашем случае Logstash будет слушать на tcp порту 3338. На него мы будем посылать netcat'м логи apache.

cluster => logs

указываем название кластера, которое мы прописали в cluster.name: в настройках Elasticsearch

host => "172.28.2.2"

ip адрес на котором бегает Elasticsearch

index => "apache-%{+YYYY.MM}"

в моём случае суточных логов apache не так много около 40000, поэтому месячного индекса достаточно. Если же логов в сутки по 500000 или больше, тогда уместнее создать суточный индекс «apache-%{+YYYY.MM.dd}»

2.3 Запускаем Logstash
# java -Xmx64m -jar logstash-1.1.9-flatjar.jar agent -f ./apache.conf

Проверяем, что Logstash запущен:
# netstat -nat |grep 3338
Если порт 3338 присутствует, значит Logstash готов принимать логи.

2.4 Начинаем посылать старые логи apache Logstash'у
# gunzip -c archived.apache.log.gz |nc 127.0.0.1 3338
Как быстро зальются все логи, зависит от многих параметров — CPU, RAM, количество логов.
В моём случае 600 тысяч строк логов полностью залились в базу за 4 минуты. Так что your mileage may vary.

2.5 Пока идёт процесс закачивания логов, можно проверить попадают ли данные в базу Elasticsearch.
Для этого в браузере введите elasticsearch_ip:9200/_status?pretty=true, если вы найдёте там строки подобные этой:

"index" : "apache-2011.09"

значит всё работает как и требовалось.

3. Kibana

3.1 Устанавливаем Кибану:
git clone --branch=kibana-ruby https://github.com/rashidkpc/Kibana.git
cd Kibana
gem install bundler
bundle install

Если вы находитесь за прокси сервером, то перед командой «git clone...» укажите ваш прокси сервер:
git config --global http.proxy http://cache.crebit.ee:3128

3.2 Конфигурация Kibana
# vi KibanaConfig.rb
Настройки, которые возможно потребуют изменений:

Elasticsearch = "localhost:9200"
KibanaPort = 5601
KibanaHost = '172.28.2.2'
Smart_index_pattern = 'apache-%Y.%m'
Smart_index_step = 2592000

3.3 Запуск Kibana
# ruby kibana.rb

После успешного запуска, на экране делжен появиться подобный текст:

== Sinatra/1.3.3 has taken the stage on 5601 for development with backup from Thin
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 172.28.21.21:5601, CTRL+C to stop

3.4 Начинаем просматривать логи
В браузере вводим адрес http://172.28.21.21:5601 и получаем удобный, быстрый интерфейс для просмотра старых логов apache.

Для желающих посмотреть что такое Kibana+Logsatsh+Elasticsearch имеется демо страница http://demo.logstash.net/

Спасибо за внимание,

Автор: timukas

Источник

Поделиться

* - обязательные к заполнению поля