Rsyslog 8: централизованный сбор логов
Задача: есть несколько серверов, на которых крутятся программы, которые сохраняют логи в свои каталоги. Необходимо централизовано сохранять все эти логи в подкаталогах по имени серверов, сохраняя названия файлов. Возможности перенастроить программы для записи логов сразу в syslog нет.
Окружение
- server - centos7
- client - centos6
И на клиенте и на сервере необходимо обновить rsyslog до последней версии.
cd /etc/yum.repos.d/ wget http://rpms.adiscon.com/v8-stable/rsyslog.repo yum update rsyslog
Решение
Rsyslog имеет следующие стандартные модули:
- imfile - чтение из файла
- omfwd - перенаправление (например, в сеть)
- imtcp - чтение из сети по tcp
- omfile - запись в файл, встроенный модуль
С помощью них произведём настройку на клиентских машинах и сервере:
На клиенте
module(load="imfile" mode="inotify") # настраиваем темплейт для строки лога: template (name="LongTagForwardFormat" type="string" string="<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%$.suffix%%msg:::sp-if-no-1st-sp%%msg%") # настраиваем правило для пересылки: ruleset(name="sendToLogserver") { action(type="omfwd" Target="192.168.1.1" Port="514" protocol="tcp" Template="LongTagForwardFormat") } # правило для чтения файлов (обязательно наличие тэга): input(type="imfile" File="/your_app_path_logs/log/*.log" tag="apptag__" ruleset="app_logs" addMetadata="on") # установка суффикса из имени лога, имя лога: ruleset(name="app_logs") { set $.suffix=re_extract($!metadata!filename, "(.*)/([^/]*)", 0, 2, "app.log"); call sendToLogserver }
На сервере
На сервере я конфигурил непосредственно /etc/rsyslog.conf:
# модуль работы с unix socket: module(load="imuxsock") # модуль работы с journald: module(load="imjournal") # наш модуль для сбора данных по сети: module(load="imtcp" MaxSessions="500") # активация модуля с назначением правил: input(type="imtcp" port="514" ruleset="remote") # темплейт для динамической записи в папку с именем хоста и с именем файла, соответствующему имени файла на клиенте: template(name="RemoteHost" type="string" string="/opt/pabkss/%HOSTNAME%/%$.logpath%") # темплейт для записи изначального текста: template(name="OnlyMsg" type="string" string="%msg:::drop-last-lf%\n") # непосредственно правила обработки: ruleset(name="remote") { # разбираем наши логи, выстраиваем правильный путь: set $.logpath = replace($programname, "__", "/"); action(type="omfile" dynaFile="RemoteHost" template="OnlyMsg") }
Используемые материалы
Возникающие проблемы
- использование одинарных кавычек;
- при наличие каких-то ошибок в синтаксисе при перезапуске на сервере отображает корректный статус, но по факту не работает; будьте внимательны, портит много нервов;
systemctl restart rsyslog