Всем добра.
Заканчиваем в этом месяце первый поток «Администратора Linux» и запускаем потихоньку второй, который теперь будет заметно переработан и усилен новыми преподавателями. Один из них — Алексей Цыкунов, делится сегодня небольшой полезной заметкой.
Поехали.
Задача
Есть несколько серверов, на которых крутятся программы, которые сохраняют логи в свои каталоги.
Необходимо централизовано сохранять все эти логи в подкаталогах по имени серверов, сохраняя названия файлов.
Возможности перенастроить программы для записи логов сразу в 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
THE END
Как всегда ждём комментарии, вопросы тут или можно заглянуть на открытый урок и помучать преподавателей там.
Автор: MaxRokatansky