Приветствую.
Нет так давно передо мной встала задача пробежаться по старым логам 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