15 декабря 2012 г. Django FreeBSD Linux Python Sentry RSyslog

Установка, настройка и связывание RSyslog и Sentry

Захотелось собирать все логи из ОС (со всех серверов) в Sentry, естественно придется использовать UDP для передачи логов, к счастью в Sentry уже есть поддержка UDP. Посовещавшись с Сашей Мироновым, я решил использовать RSyslog, немного погуглив я обнаружил вот такой Gist Bridge to send rsyslog logs to sentry (который я потом успешно форкнул и отрефакторил). Теперь осталось только написать правила и запустить эту цепь.

Статья в основном для FreeBSD, но как обычно конфиги совпадают, просто заменяйте слова "установить из портов" на "установить из пакетов". Не думаю, что в остальном что-то серьзено изменится.

Запускаем UDP-сервер для Sentry

Зайдите на сервер где вы ранее устанавливали Sentry и откройте конфигурационный файл:

emacs /etc/sentry.conf

Добавьте следующее:

SENTRY_UDP_HOST = '198.51.100.1'  # Внешний IP-адрес вашего сетевого интерфейса
SENTRY_UDP_PORT = 9091

Доустанавливаем нужные приложения:

. /var/www/sentry/bin/activate
pip install raven eventlet

И проверяем работает ли UDP-сервер:

/var/www/sentry/bin/sentry --config=/etc/sentry.conf start udp

Теперь, добавьте в Supervisor следующие строки:

[program:sentry_udp]
directory=/var/www/sentry
command=/var/www/sentry/bin/sentry --config=/etc/sentry.conf start udp autostart=true
autorestart=true

Обновите список программ в Supervisor и запустите sentry_udp:

supervisorctl reread
supervisorctl start sentry_udp

Устанавливаем и настраиваем RSyslog

Теперь войдите на сервер, который будет посылать логи (вообщем, в нашей схеме это получается клиент на FreeBSD):

cd /usr/ports/sysutils/rsyslog6
make install clean

Теперь настроим RSyslog, например для логов Nginx:

emacs /usr/local/etc/rsyslog.conf
$ModLoad imfile

# Nginx
$InputFileName /var/log/nginx-error.log
$InputFileTag nginx-error:
$InputFileStateFile stat-nginx-error
$InputFileSeverity info

$InputRunFileMonitor

$ActionQueueType           LinkedList   # use asynchronous processing
$ActionQueueFileName       test         # set file name, also enables disk mode
$ActionResumeRetryCount    -1           # infinite retries on insert failure
$ActionQueueSaveOnShutdown on           # save in-memory data if rsyslog shuts down

# Transfer all of the logs to this UDP port
*.* @@127.0.0.1:10514;RSYSLOG_SyslogProtocol23Format

Где, "127.0.0.1" - IP-адрес локального моста RSyslog->Sentry, речь о котором пойдет ниже, а "10514" - его UDP-порт.

Далее, остановим Syslog, запустим RSyslog:

echo 'syslogd_enable="NO"' >> /etc/rc.conf
echo 'rsyslogd_enable="YES"' >> /etc/rc.conf
/etc/rc.d/syslogd stop
/usr/local/etc/rc.d/rsyslogd start

Всё, теперь мы посылаем логи по UDP на наш мост, осталось только настроить и запустить его на этом же сервере.

Запускаем мост RSyslog->Sentry

Спасибо Patrick, за то что съэкономил мое и ваше время, написав этот мост. Установим нужные мосту зависимости:

pip install raven loggerglue

Качаем мой форк моста:

fetch -o /path/to/rsyslog_sentry.py https://gist.github.com/raw/4296753/ca09825373ace6cb815cda9a9cc921bd67b11bd6/rsyslog_sentry.py

Теперь откройте этот файл на редактирование и найдите строчку <your dsn here>, укажите DSN полученный из Sentry (не забудьте добавить номер UDP-порта, который вы указали в SENTRY_UDP_PORT):

client = Client(dsn='udp://<PUBLIC_KEY>:<SECRET_KEY>@sentry.example.org:9091/2')
Конечно вы можете передавать логи и по http:
client = Client(dsn='http://<PUBLIC_KEY>:<SECRET_KEY>@sentry.example.org/2')

После чего найдите строку где поднимается SyslogServer (он будет локально слушать UDP-порт, на который буду приходить сообщения от RSyslog) и укажите нужный IP-адрес и UDP-порт:

s = SyslogServer(('127.0.0.1', 10514), SimpleHandler)

Сейчас, вы уже можете запустить:

python /path/to/rsyslog_sentry.py

Но лучше добавить в Supervisor:

[program:rsyslog_sentry]
command=python /path/to/rsyslog_sentry.py
autostart=true
autorestart=true

Запускаем в Supervisor:

supervisorctl reread
supervisorctl start rsyslog_sentry

Вот и всё, цепь настроена, если возникнут проблемы - пишите!

Что почитать?

Комментарии

Саша Миронов 18 декабря 2012 г. 12:31

О_о) я теперь медийная персона!

Ну а как же! Пора бы уже :-)

hi :)

I changed the IP, dsn and rsyslog conf like if $programname == 'supervisord' then @@192.168.1.101:10514, and run the sсript, when my rsyslog logs send to my server, the sсript got an exception,like

Traceback (most recent call last):
    File "/usr/local/lib/python2.7/dist-packages/loggerglue/rfc5424.py", line 297, in from_line
    r = syslog_msg.parseString(line.strip())
  File "/usr/local/lib/python2.7/dist-packages/pyparsing.py", line 1041, in parseString
    raise exc
ParseException: Expected W:(-) (at char 57), (line:1, col:58)
Expected W:(-) (at char 57), (line:1, col:58)

my supervisor log like this Aug 13 15:25:26 ubuntu supervisord: svtest SVTEST Tue Aug 13 15:25:25 2013
and in rfc5424.py,the line value like this '<14>1 2013-08-13T15:29:42+08:00 ubuntu supervisord - - svtest SVTEST Tue Aug 13 15:29:41 2013'

can u help me? :) thanks. my OS is ubuntu 12.04

Оставьте свой комментарий

Markdown