Gentoo Way Linux, Gentoo, Kubuntu, Ubuntu, Debian … компилируем всё!

14Мар/13Off

Ubuntu — Rsyslog server, nginx acces log collector

Надоело мне смотреть логи nginx на разных серверах кластера путём переключения консолей, а захотелось видеть всё в одном потоке. Такое умеет стандартный менеджер логов в поставке Ubuntu (и не только) - rsyslog, его и будем использовать.

Для начала настроим клиенты, те машины что логи будут отправлять:

nano /etc/rsyslog.d/99-nginx.conf
# Загружаем модуль для работы с файлами
$ModLoad imfile
# Указываем какой файл будем экспортировать
$InputFileName /var/log/nginx/access.log
# Назначаем тэг, который будет дописываться на сервере получателе, чтобы можно было понять с какой машины пришла запись
$InputFileTag hostX-access:
# Временный файл, в который rsyslog будет записывать текущую позицию
$InputFileStateFile access
# Источник сообщения
$InputFileFacility local0
# Уровень серьёзности сообщения
$InputFileSeverity info
# Запускаем мониторинг изменений в файле
$InputRunFileMonitor

# Отправлять накопленные данные будем каждую секунду
$InputFilePollInterval 1

# Указываем куда будем отправлять, в данном случае все сообщения local0 будут отправляться по UDP со сжатием gzip 7 на сервер 192.168.1.1
local0.*   @(z7)192.168.1.1:514

Такой конфиг нужно будет сделать на каждом сервере (hostX можно пронумеровать по каждому серверу или назначить более понятные вам теги).

Также нужно проверить что rsyslog сможет прочитать логи и сохранить файлы состояний:

chown syslog:syslog /var/spool/rsyslog && \
chmod 0750 /var/spool/rsyslog && \
chmod 0755 /var/log/nginx/ && \
chmod 0644 /var/log/nginx/access.log

Если у вас работает logrotate то нужно поправить конфиг чтобы новые файлы логов nginx создавались с правами 0644:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 0644 www-data adm # поправлено
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi; \
    endscript
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Конфиг сервера, в /etc/rsyslog.conf добавить настройку приёма логов по UDP:

$ModLoad imudp
$UDPServerRun 514 # Порт нужно будет открыть на фаерволе
# Не забываем установить ограничения от кого можно принимать логи, IP перечисляются через запятую
$AllowedSender UDP, 192.168.1.0/24

В конфиге по-умолчанию, если логи с серверов не нужны в syslog сервера нужно добавить указание куда их собирать

nano /etc/rsyslog.d/50-default.conf
*.*;auth,authpriv.none,local0.none      -/var/log/syslog
local0.*            -/var/log/group.access.log

service rsyslog restart и можно наблюдать полную картину:

tailf /var/log/group.access.log

Отладка
Если что-то не будет работать, можно запустить rsyslog в режиме отладки, например так:

rsyslogd -c5 -dn

На сервере можно слушать порт таким образом:

tcpdump -vvv -nn -i eth0 udp port 514