Graylog2 – это open source решение для централизованного сбора, хранения и анализа логов. Cостоит из:
– Сервер написанный на Java, принимающий syslog messages через TCP, UDP или AMQP
– Логи хранятся в ElasticSearch
– MongoBD для статистики и графиков
– Кавайный Web interface
Graylog2 принимает логи через TCP/UDP как и обычный syslog и GELF через UDP. Почитать чем хорош GELF. Можно отправлять логи используя оба формата через AMQP

Сервер на котором будем устанавливать Graylog
# uname -a Linux centos.bezha.od.ua 2.6.32-220.el6.x86_64 #1 SMP x86_64 GNU/Linux # cat /etc/issue CentOS release 6.2 (Final)
Устанавливаем graylog2-server
Подключим репозиторий EPEL
# rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
Устанавливаем Java и gcc и curl-devel zlib-devel
# yum -y install lsb gcc make java-1.6.0-openjdk curl-devel zlib-devel openssl-devel
Устанавливаем mongodb-server
# yum -y install mongodb mongodb-server
Создаем пользователя:
# mongo MongoDB shell version: 1.8.2 connecting to: test
> use admin switched to db admin
> db.addUser('admin', 'Password')
{
"user" : "admin",
"readOnly" : false,
"pwd" : "Password"
}
> db.auth('admin', 'Password')
1
> use graylog2 switched to db graylog2
> db.addUser('grayloguser', 'Password')
{
"user" : "grayloguser",
"readOnly" : false,
"pwd" : "Password"
}
> db.auth('grayloguser', 'Password')
1
> exit bye
Делаем Mongodb более безопастной
/etc/mongodb.conf auth = true
Перестартуем Mongodb
# service mongod restart
Добавляем в автозагрузку
# chkconfig mongod on # chkconfig --list | grep mongod mongod 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Проверяем что все работает:
# netstat -nlp | grep mongod tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 3326/mongod tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 3326/mongod
Устанавливаем Elasticsearch Скачиваем самую последнюю стабильную версию
# curl -L -O https://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.19.0.zip # unzip elasticsearch-0.17.2.zip # mv elasticsearch-0.17.2 /usr/local/elasticsearch # rm -Rf elasticsearch*.zip
Устанавливаем Service wrapper
# cd /usr/local/elasticsearch # curl -kL http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz # mv *servicewrapper*/service /usr/local/elasticsearch/bin/ # rm -Rf *servicewrapper*
Устанавливаем elasticsearch как сервис по этой документации
# /usr/local/elasticsearch/bin/service/elasticsearch install Detected RHEL or Fedora: Installing the ElasticSearch daemon..
Перестартуем Elasticsearch
# service elasticsearch restart Stopping ElasticSearch... ElasticSearch was not running. Starting ElasticSearch... Waiting for ElasticSearch...... running: PID:2122
Добавляем в автозагрузку
# chkconfig elasticsearch on # chkconfig --list | grep elasticsearch elasticsearch 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Скачиваем последнюю стабильную версию Graylog2-server 0.9.6
# wget https://github.com/downloads/Graylog2/graylog2-server/graylog2-server-0.9.6.tar.gz # tar xfvz graylog2-server-0.9.6.tar.gz # mv graylog2-server-0.9.6 /usr/local/graylog2-server
Копируем
# cd /usr/local/graylog2-server # cp graylog2.conf.example /etc/graylog2.conf # mcedit /etc/graylog2.conf
Редактируем /etc/graylog2.conf подставляем пользователя и его пароль mongodb, которые мы создавали ранее.
# grep -v -E "#|^$" graylog2.conf syslog_listen_port = 514 syslog_protocol = udp elasticsearch_url = http://localhost:9200/ elasticsearch_index_name = graylog2 force_syslog_rdns = false mongodb_useauth = true mongodb_user = grayloguser mongodb_password = Password mongodb_host = localhost mongodb_database = graylog2 mongodb_port = 27017 mq_batch_size = 4000 mq_poll_freq = 1 mq_max_size = 0 mongodb_max_connections = 100 mongodb_threads_allowed_to_block_multiplier = 5 use_gelf = true gelf_listen_address = 0.0.0.0 gelf_listen_port = 12201 amqp_enabled = false amqp_subscribed_queues = somequeue1:gelf,somequeue2:gelf,somequeue3:syslog amqp_host = localhost amqp_port = 5672 amqp_username = guest amqp_password = guest amqp_virtualhost = / forwarder_loggly_timeout = 3
Создаем init скрипт для запуска Graylog2-server /etc/init.d/graylog2
#!/bin/bash
#
# graylog2-server - This script starts and stops the graylog2-server daemon
#
# chkconfig: - 85 15
# description: graylog2 is a syslog implementation that stores logs in MongoDB
### BEGIN INIT INFO
# Provides:
# Required-Start: $network
# Required-Stop: $network
# Default-Stop: 0 1 2 6
# Short-Description: Start/stop the graylog2-server daemon
# Description: A syslog implementation that stores logs in MongoDB
### END INIT INFO
# Source function library.
. /etc/init.d/functions
# Check networking
. /etc/sysconfig/network
[[ $NETWORKING == no ]] && exit 0
prog="graylog2-server"
jar="/usr/local/$prog/$prog.jar"
lockfile="/var/lock/$prog"
logfile="/var/log/graylog2.log"
pidfile="/var/run/$prog.pid"
JAVA_BIN="/usr/bin/java"
unset pid
gl2_run() {
# Disable csh style history expansion for safety
set +H
daemon "( $JAVA_BIN -jar \"$jar\" >\"$logfile\" 2>&1 & echo \"\$!\" >\"$pidfile\" )"
pid=$(<"$pidfile")
sleep 1
if kill -0 "$pid" >/dev/null 2>&1
then
return 0
else
return 1
fi
}
gl2_status() {
[[ -f $pidfile ]] && pid=$(<"$pidfile")
[[ -z $pid ]] && return 1
if kill -0 "$pid" >/dev/null 2>&1
then
return 0
else
return 1
fi
}
status() {
if gl2_status
then
echo $"$prog (pid $pid) is running..."
return 0
else
if [[ -f $lockfile ]]
then
echo $"$prog dead but subsys locked"
return 2
fi
echo $"$prog is stopped"
return 3
fi
}
start() {
[[ -r $jar ]] || exit 5
gl2_run >/dev/null 2>&1
if [[ $? -eq 0 ]]
then
retval=0
touch "$lockfile"
success
else
retval=1
failure
fi
echo $"Starting $prog: "
return "$retval"
}
stop() {
killproc -p "$pidfile"
if [[ $? -eq 0 ]]
then
retval=0
rm -f "$lockfile"
success
else
retval=1
failure
fi
echo $"Stopping $prog: "
return "$retval"
}
restart() {
stop
start
}
reload() {
restart
}
force_reload() {
restart
}
case "$1" in
start)
gl2_status && exit 0
$1
;;
stop)
gl2_status || exit 0
$1
;;
restart)
$1
;;
reload)
gl2_status || exit 7
$1
;;
force-reload)
force_reload
;;
status)
$1
;;
condrestart|try-restart)
gl2_status || exit 0
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac
exit $?
Добавляем Graylog2-server в автозагрузку
# chmod +x /etc/init.d/graylog2 # chkconfig --add graylog2 # chkconfig graylog2 on # chkconfig --list |grep graylog2 graylog2 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Запускаем Graylog2-server
# service graylog2 start
Usage: /etc/init.d/graylog2 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}
Проверяем
# ps waux | grep graylog2 root 2907 /usr/bin/java -jar /usr/local/graylog2-server/graylog2-server.jar
Устанавливаем Web interface
Устанавливаем RVM
# bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
Downloading RVM from wayneeseguin branch stable
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 829k 100 829k 0 0 250k 0 0:00:03 0:00:03 --:--:-- 438k
Installing RVM to /usr/local/rvm/
Creating RVM system user group 'rvm'
# RVM: Shell scripts enabling management of multiple ruby environments.
# RTFM: https://rvm.beginrescueend.com/
# HELP: http://webchat.freenode.net/?channels=rvm (#rvm on irc.freenode.net)
# Screencast: http://screencasts.org/episodes/how-to-use-rvm
# In case of any issues read output of 'rvm requirements' and/or 'rvm notes'
Installation of RVM in /usr/local/rvm/ is almost complete:
* First you need add all users that will be using rvm to 'rvm' group,
anyone using rvm will be operating with `umask g+w`.
* To start using RVM you need to run `source /etc/profile.d/rvm.sh`
in all your open shell windows, in rare cases you need to reopen all shell windows.
* Optionally you can run `rvm tools rvm-env ruby bash` which will generate
shebang wrappers for easier selecting ruby in scripts.
# root,
#
# Thank you for using RVM!
# I sincerely hope that RVM helps to make your life easier and more enjoyable!!!
#
# ~Wayne
После перезапуска терминала устанавливаем Ruby 1.9.2
# rvm install 1.9.2 # rvm alias create default 1.9.2
Посмотреть, какие версии доступны в данный момент в системе и какие из них используются по умолчанию
# rvm list rvm rubies =* ruby-1.9.2-p290 [ x86_64 ] # => - current # =* - current && default # * - default
Скачиваем последнюю версию версию Graylog2-web-interface
# wget https://github.com/downloads/Graylog2/graylog2-web-interface/graylog2-web-interface-0.9.6.tar.gz # tar xzvf graylog2-web-interface-0.9.6.tar.gz # mv graylog2-web-interface-0.9.6/ /usr/local/graylog2-web-interface # adduser -m graylog
Устанавливаем gem bundle
# cd /usr/local/graylog2-web-interface # gem install bundler Successfully installed bundler-1.0.22 1 gem installed # bundle install Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
Выполняем конфигурацию Graylog2-web-interface
# cd /usr/local/graylog2-web-interface/config # mcedit mongoid.yml production: host: localhost port: 27017 username: grayloguser password: Password database: graylog2
Устанавливаем passenger-standalone
# gem install passenger # gem install file-tail # cd /urs/local/graylog2-web-interface # mkdir tmp log # chmod -R 777 tmp log
Создаем init скрипт для запуска Graylog2-web-interface Источник
#!/bin/bash
#
# graylog2-web-interface: graylog2 web interface
#
# chkconfig: - 98 02
# description: Starts graylog2-web-interface using passenger-standalone. \
# Uses RVM to use switch to a specific ruby version.
#
# config
USER=graylog
APP_DIR=/usr/local/graylog2-web-interface
RVM_RUBY=1.9.2
ADDR=127.0.0.1
PORT=3000
ENVIRONMENT=production
LOG_FILE=/var/log/graylog2-web-interface.log
# --
CMD_START="cd $APP_DIR; rvm use $RVM_RUBY; passenger start -d \
-a $ADDR \
-p $PORT \
-e $ENVIRONMENT \
--user $USER"
CMD_STOP="cd $APP_DIR; rvm use $RVM_RUBY; passenger stop -p $PORT"
CMD_STATUS="cd $APP_DIR; rvm use $RVM_RUBY; passenger status -p $PORT"
. /lib/lsb/init-functions
case "$1" in
start)
echo "Starting graylog2-web-interface"
su - $USER -c "$CMD_START"
;;
stop)
echo "Stopping graylog2-web-interface"
su - $USER -c "$CMD_STOP"
;;
status)
su - $USER -c "$CMD_STATUS"
;;
*)
echo "Usage: $0 start|stop|status"
exit 3
;;
esac
Устанавливаем graylog2-web-interface как сервис
# chmod +x /etc/init.d/graylog2-web # chkconfig --add graylog2-web # chkconfig graylog2-web on
Устанавливаем Apache
# yum -y install httpd # chkconfig httpd on
Прописываем Virtual host /etc/httpd/conf.d/graylog2.conf (Убрать пробелы между <>)
< VirtualHost *:80 >
ServerName graylog2.bezha.od.ua
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
CustomLog /var/log/httpd/log.mydomain.com-access_log common
< /VirtualHost >
Перезапускаем httpd
# service httpd configtest Syntax OK # service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
Заходим в Web-Interface создаем первого пользователя

Добавим первый хост в Graylog через rsyslog /etc/rsyslog.conf
Через UDP
*.* @127.0.0.1
Через TCP
*.* @@127.0.0.1
Перезапускаем Rsyslog
# service rsyslog restart
Поиск по сообщениям. Use case: Посмотреть с каких ip адресов и в какое время происходил заход на сервер пользователем root

Если кликнуть по сообщению появляется дополнительная информация

Можно создать stream, который будет фильтровать только определенные сообщения. Например stream который показывает сообщения Severity Critical

Нагрузка при реальном использовании на VPS:

CPU[||||||| 7.2%] Tasks: 184 total, 1 running Mem[|||||||||||||||||||||||||||||||||||||||||||||||||||||691/996MB] Load average: 0.18 0.17 0.27 Swp[|||| 97/2015MB] Uptime: 36 days, 03:25:18


