Всем добра.

Заканчиваем в этом месяце первый поток «Администратора 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


Как всегда ждём комментарии, вопросы тут или можно заглянуть на открытый урок и помучать преподавателей там.

Комментарии (2)


  1. dmitrye1
    02.04.2018 22:05

    Что-то похожее из опыта:
    1. На логсервере алиасом поднято несколько IP адресов, каждые адрес отвечает за сбор данных с разных направлений: сеть, сервера, телефония, безопасность, инженерные системы. Соответственно, файлы журналов размещаются в различных каталогах, в зависимости от направления.
    2. Файлы журналов размещаются в подкаталогах с именами, включающих год и месяц. Жмутся по крону через месяц, удаляются обычно через год, пустые каталоги удаляются. Имя файла кроме hostname из обратного DNS резольвинга содержит и IP адрес источника лога.
    3. Существует отдельный файл с копией журналов особо критичных устройств, критичных ошибок со всех устройств, авторизация админами с неадминских IP сетей. В начале рабочего дня и ближе к концу на 15 минут в файл пропускаются ошибки резервированных блоков питания, вентиляторов — иначе банально забьют логи сообщениями раз в 30секунд. Сам файл показывается по web через loganalyzer, который включен внешней страницей в слайдшоу zabbix. Все это на телевизоре в комнате админов.
    Правда все на syslog-ng.


  1. selivanov_pavel
    03.04.2018 01:27

    Очередная статья формата "копипасть не понимая". Почему imfile грузится с mode=inotify? (для работы вайлдкардов в именах лог-файлов). Откуда берутся переменные, которые используются в template? Что такое ruleset, сколько их, как они связаны с input? Каков порядок приёма и обработки логов?


    Очень похоже на мою статью, только с полностью выкинутыми объясненями и без многострочных логов.