🗂 Полное руководство по rsyslog

rsyslog — один из самых популярных и мощных системных демонoв для сбора и управления логами в Linux/Unix-системах.
Он умеет:


📑 Содержание


1️⃣ Введение и отличия от syslog

Преимущества rsyslog:


2️⃣ Установка rsyslog

Debian / Ubuntu / Astra Linux

sudo apt update
sudo apt install rsyslog
sudo systemctl enable rsyslog
sudo systemctl start rsyslog

RedHat / CentOS / Red OS

sudo dnf install rsyslog
sudo systemctl enable rsyslog
sudo systemctl start rsyslog

Проверка версии:

rsyslogd -v

Статус службы:

sudo systemctl status rsyslog

3️⃣ Основная конфигурация

Главный конфигурационный файл:

/etc/rsyslog.conf

Дополнительные конфиги можно добавлять в:

/etc/rsyslog.d/*.conf

Структура

  1. Модули (modules) — подключение входных/выходных драйверов.
  2. Global Directives — общие параметры (WorkDirectory, ActionQueueType и т.д.).
  3. Rules / Actions — фильтры, куда отправлять сообщения.
  4. Templates — кастомный формат вывода.

Пример минимальной конфигурации:

module(load="imuxsock")   # для локальных логов (Unix socket /var/run/syslog)
module(load="imklog")     # для логов ядра

# Хранение логов в текстовые файлы
*.info;mail.none;authpriv.none;cron.none   /var/log/messages
authpriv.*                                /var/log/secure
mail.*                                    -/var/log/maillog
cron.*                                    /var/log/cron

# Пересылка удалённому серверу
*.* @@10.10.10.5:514      # TCP, с @ один UDP, с @@ TCP

4️⃣ Формат сообщений и шаблоны

rsyslog позволяет настраивать произвольный формат логов через templates.

Пример JSON-шаблона:

template(name="jsonTemplate" type="list") {
    constant(value="{")
    property(name="timestamp" dateFormat="rfc3339")
    constant(value=", ")
    property(name="hostname")
    constant(value=", ")
    property(name="syslogtag")
    constant(value=", ")
    property(name="msg")
    constant(value="}\n")
}

*.* action(type="omfile" file="/var/log/messages.json" template="jsonTemplate")

5️⃣ Фильтры и правила

Примеры фильтров:

*.info     /var/log/info.log
*.err      /var/log/errors.log
if $programname == 'nginx' then /var/log/nginx.log
*.info;mail.none;authpriv.none;cron.none /var/log/messages
if $hostname == 'web01' then /var/log/web01.log

6️⃣ Работа по сети: UDP, TCP, TLS

Включение TCP / UDP

module(load="imtcp")      # TCP
input(type="imtcp" port="514")

module(load="imudp")      # UDP
input(type="imudp" port="514")

Настройка TLS

$DefaultNetstreamDriverCAFile /etc/ssl/certs/ca.crt
$DefaultNetstreamDriverCertFile /etc/ssl/certs/server.crt
$DefaultNetstreamDriverKeyFile  /etc/ssl/private/server.key
$ActionSendStreamDriver gtls
$ActionSendStreamDriverMode 1
$ActionSendStreamDriverAuthMode x509/name

7️⃣ Централизованный сбор логов

Сервер

# /etc/rsyslog.d/10-remote.conf
module(load="imtcp")
input(type="imtcp" port="514")
$template RemoteFormat,"%timegenerated% %HOSTNAME% %syslogtag% %msg%\n"
*.* ?RemoteFormat

Клиент

*.* @@rsyslog-server.example.com:514   # TCP

@ = UDP, @@ = TCP


8️⃣ Ротация и хранение логов

$MaxFileSize 50M
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

9️⃣ Диагностика и проверка

rsyslogd -N1
sudo rsyslogd -d
journalctl -u rsyslog

🔧 Продвинутые возможности


📋 Практические примеры

if $programname == 'nginx' then /var/log/nginx.log
if $programname == 'php-fpm' then /var/log/php-fpm.log
*.err @@logserver.example.com:514
template(name="GELFTemplate" type="list") {
    constant(value="{")
    property(name="timestamp")
    constant(value=", ")
    property(name="hostname")
    constant(value=", ")
    property(name="msg")
    constant(value="}\n")
}
*.* action(type="omfile" file="/var/log/messages.json" template="GELFTemplate")

💡 Советы для production


📎 Связанные статьи: