Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров47K
Приветствую.

Нет так давно передо мной встала задача пробежаться по старым логам 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 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 (размер 60MB)
# wget logstash.objects.dreamhost.com/release/logstash-1.1.9-flatjar.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 github.com/rashidkpc/Kibana.git
cd Kibana
gem install bundler
bundle install

Если вы находитесь за прокси сервером, то перед командой «git clone...» укажите ваш прокси сервер:
git config --global http.proxy proxy.domain.com: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/

Спасибо за внимание,
Теги:
Хабы:
+13
Комментарии25

Публикации

Изменить настройки темы

Истории

Работа

Ближайшие события