🗂 Полное руководство по rsyslog
rsyslog — один из самых популярных и мощных системных демонoв для сбора и управления логами в Linux/Unix-системах.
Он умеет:
- Принимать логи локально и по сети (UDP/TCP/TLS);
- Фильтровать по хостам, сервисам, приоритетам;
- Форматировать записи (шаблоны);
- Хранить логи в бинарных или текстовых файлах;
- Пересылать в централизованные системы мониторинга (ELK, Graylog, Splunk и т.д.).
📑 Содержание
- 1. Введение и отличия от syslog
- 2. Установка rsyslog
- 3. Основная конфигурация
- 4. Формат сообщений и шаблоны
- 5. Фильтры и правила
- 6. Работа по сети: UDP, TCP, TLS
- 7. Централизованный сбор логов
- 8. Ротация и хранение логов
- 9. Диагностика и проверка
- 10. Продвинутые возможности
- 11. Практические примеры
- 12. Советы по продакшн настройке
1️⃣ Введение и отличия от syslog
syslog— традиционный системный логгер (legacy).rsyslog— современный, с модульной архитектурой, поддержкой TCP/TLS, шаблонов, структурированных сообщений (JSON, GELF), очередей и асинхронной доставки.- Используется по умолчанию в большинстве современных дистрибутивов: Debian, Ubuntu, RedHat, CentOS, Astra Linux.
Преимущества rsyslog:
- Высокая производительность (млн сообщений/сек на современном сервере);
- Централизованная маршрутизация и пересылка;
- Шаблоны для кастомного формата логов;
- Модульная структура: input, output, filter, parser.
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
Структура
- Модули (modules) — подключение входных/выходных драйверов.
- Global Directives — общие параметры (
WorkDirectory,ActionQueueTypeи т.д.). - Rules / Actions — фильтры, куда отправлять сообщения.
- 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
- По hostname:
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️⃣ Ротация и хранение логов
- Использовать logrotate для файлов
/var/log/*.log. - Можно включить встроенную ротацию через
rsyslog:
$MaxFileSize 50M
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
9️⃣ Диагностика и проверка
- Проверить синтаксис конфигурации:
rsyslogd -N1
- Просмотреть текущие правила:
sudo rsyslogd -d
- Логи самого rsyslog:
journalctl -u rsyslog
🔧 Продвинутые возможности
- Многопоточность (
$ActionQueueType LinkedList/Direct/FixedArray); - Асинхронные очереди (ActionQueue);
- Фильтрация по шаблону / регулярным выражениям (
contains,startswith); - Поддержка GELF / JSON для интеграции с ELK;
- Многоуровневая маршрутизация (split по host, unit, priority).
📋 Практические примеры
- Логи nginx и php-fpm в разные файлы:
if $programname == 'nginx' then /var/log/nginx.log
if $programname == 'php-fpm' then /var/log/php-fpm.log
- Централизованная пересылка ошибок на сервер:
*.err @@logserver.example.com:514
- JSON-шаблон для ELK:
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
- Всегда включайте TCP + TLS для пересылки логов между серверами;
- Используйте фильтры по программам и приоритету, чтобы не перегружать диск;
- Настройте логротейт (logrotate) с ротацией и сжатием;
- Для больших систем — используйте асинхронные очереди (
ActionQueueType LinkedList); - JSON / GELF — для интеграции с централизованными системами мониторинга;
- Мониторьте
journalctl -u rsyslogдля состояния демона.
📎 Связанные статьи: