Несколько дней новогоднего волшебства:
Успейте начать обучение в 2018-ом году со скидкой до 30%!
Выбрать курс

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