Rsyslog 8: централизованный сбор логов | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Алгоритмы и структуры данных Team Lead Архитектура и шаблоны проектирования Разработчик IoT C# Developer. Professional PostgreSQL Разработчик на Spring Framework
-5%
Flutter Mobile Developer NoSQL iOS Developer. Basic
-10%
C++ Developer. Basic C++ Developer. Professional Android Developer. Professional Microservice Architecture Unity Game Developer. Professional Базы данных Node.js Developer React.js Developer Специализация Java-разработчик
-25%
Web-разработчик на Python Framework Laravel Cloud Solution Architecture Vue.js разработчик Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool" PHP Developer. Basic
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK Administrator Linux. Professional Дизайн сетей ЦОД Разработчик IoT PostgreSQL Экспресс-курс "Версионирование и командная работа с помощью Git"
-30%
Microservice Architecture Highload Architect Специализация Administrator Linux
-25%
Network engineer Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool" Network engineer. Basic
Корпоративные курсы
Безопасность веб-приложений IT-Recruiter Дизайн сетей ЦОД Компьютерное зрение Разработчик IoT Вебинар CERTIPORT Machine Learning. Professional
-6%
NoSQL Пентест. Практика тестирования на проникновение Java QA Engineer. Базовый курс Руководитель поддержки пользователей в IT
-8%
SRE практики и инструменты Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Infrastructure as a code Супер-практикум по использованию и настройке GIT Промышленный ML на больших данных Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» BPMN: Моделирование бизнес-процессов Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

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 комментариев
Для комментирования необходимо авторизоваться