Тема в рунете описана достаточно, но когда дошло до дела я столкнулся с рядом несоответствий, поэтому решил описать свой опыт, чтобы не забыть. В качестве сервера использую centos 7.7 . клиенты — коммутаторы и маршрутизаторы cisco.
Для решения задачи централизованного сбора логов необходимо настроить два сервиса — rsyslog и logrotate.
rsyslog
настраивается конфигом /etc/rsyslog.conf или созданием файла с произвольным именем в папке /etc/rsyslog.d/
В конфиге необходимо подключить модули imupd и/или imtcp, а также определить порты. Я подключаю оба.
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
Далее необходимо определить правило для обработки логов удаленных систем. Общий формат правил это — facility.severity_level destination (where to store log) .
но существуют дополнительные возможности, а именно условный оператор, т.е. проверка соответствия сообщения каким либо условиям. В моем случае все сетевые устройства принадлежат определенной сети, что я и хочу использовать в качестве условия.
Так как конфигурация может (и будет) меняться, мне требуется универсальное решение. Поэтому в правиле обработки есть смысл использовать шаблон, которые необходимо определить в конфиге выше правила.
В случае срабатывания условия, необходимо остановить процесс обработки. Иначе сообщение будет обработано остальными правилами и, в случае если они дефолтные — попадет в /var/log/messages — чего хотелось бы избежать.
$template RemoteLogs,"/var/log/remote/%HOSTNAME%.log"
#определяем шаблон
if $fromhost-ip contains '192.9.33' then ?RemoteLogs
#определяем условие и применяем шаблон
& stop
#останавливаем процесс в случае срабатывания услови
Важно помнить что шаблон, правило и остановка должны быть определены в конфиге раньше основного правила обработки. Иначе запись событий попадет в основной журнал системы
*.info;mail.none;authpriv.none;cron.none /var/log/messages
Команды управления сервисом стандартные
systemctl start rsyslog
systemctl status rsyslog
systemctl stop rsyslog
systemctl restart rsyslog
systemctl enable rsyslog
Для проверки работы основного системного журнала можно использовать команду
logger test message
Открыть файрвол следует следующими командами
firewall-cmd --add-port=514/udp --permanent
firewall-cmd --reload
logrotate
Далее следует позаботиться о перезаписи лог-файлов. Иначе рано или поздно логи заполнят все доступное дисковое пространство. Для этого следует донастроить скрипт logrotate. По умолчанию он запускается через /etc/cron.daily . Чтобы его настроить необходимо либо отредактировать файл /etc/logrotate.conf либо добавить файл с произвольным именем в каталог /etc/logrotate.d/ . В моем случае конфигурация следующая
/var/log/remote/*.log
{
rotate 10
missingok
notifempty
compress
size 10M
daily
create 0644 root root
postrotate
systemctl restart rsyslog > /dev/null
endscript
}