Rsyslog 8: централизованный сбор логов | OTUS
OTUS исполняется 3 года!
Скидки до 30% в честь дня рождения! Успейте купить курс по выгодной цене ➞
Выбрать курс

Курсы

Программирование
MS SQL Server разработчик AWS для разработчиков CI/CD на AWS, Azure и Gitlab Архитектура и шаблоны проектирования
-20%
Разработчик C++
-20%
Разработчик Java
-20%
React.js разработчик
-20%
Интенсив "Оптимизация в Java"
-50%
Framework Laravel
-30%
Базы данных
-20%
Разработчик на Spring Framework
-20%
Разработчик Golang
-10%
Разработчик C#
-10%
Team Lead 2.0
-30%
Vue.js разработчик
-20%
Разработчик Java Enterprise ReactJS/React Native-разработчик Разработчик голосовых ассистентов и чат-ботов
Специализации Курсы в разработке Подготовительные курсы
+7 499 110-61-65

Rsyslog 8: централизованный сбор логов

LinuxHabr1Site.png

Задача: есть несколько серверов, на которых крутятся программы, которые сохраняют логи в свои каталоги. Необходимо централизовано сохранять все эти логи в подкаталогах по имени серверов, сохраняя названия файлов. Возможности перенастроить программы для записи логов сразу в 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

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
🔥 Скидки до 50% на новые супер-интенсивы!
«Тестирование игр», «Data Engineer», «работа с протоколом BGP». Узнайте подробности в чате ➞