Введение / Зачем это нужно
Syslog — это стандартный протокол для сбора и хранения системных логов в Unix-подобных операционных системах. Понимание syslog критически важно для системных администраторов и разработчиков: оно позволяет мониторить работу системы, диагностировать проблемы, отслеживать безопасность и анализировать производительность. В этом гайде вы изучите архитектуру syslog, научитесь настраивать демон rsyslog и работать с логами на практике. После выполнения вы сможете эффективно отслеживать события в Linux, настраивать логирование для своих приложений и поддерживать порядок в системных журналах.
Требования / Подготовка
Перед началом убедитесь, что у вас есть:
- Доступ к Linux-системе (Ubuntu, CentOS, Debian или другой) с правами суперпользователя (sudo).
- Установленный пакет
rsyslog(в большинстве дистрибутивов он есть по умолчанию; если нет — установите по инструкции ниже). - Базовые знания работы в терминале и редактирования текстовых файлов (например, с помощью
nanoилиvim). - Понимание основных команд Linux (например,
ls,cat,grep).
Шаг 1: Архитектура syslog
Syslog состоит из нескольких ключевых компонентов, которые работают вместе для сбора, маршрутизации и хранения логов:
- Демон syslog (например,
rsyslogилиsyslog-ng): фоновый процесс, который принимает сообщения от приложений, ядра и сетевых источников, затем фильтрует и направляет их в указанные места (файлы, базы данных, удалённые серверы). - Конфигурационные файлы: определяют правила обработки сообщений. Основной файл —
/etc/rsyslog.conf, а дополнительные конфигурации можно размещать в/etc/rsyslog.d/(файлы с расширением.conf). - Уровни логирования: каждое сообщение имеет:
- Facility (категория источника): например,
auth(аутентификация),cron(задачи cron),local0–local7(пользовательские категории),kern(ядро). - Severity (уровень важности): от
debug(отладка) доemerg(критическая ошибка). Порядок:debug,info,notice,warning,err,crit,alert,emerg.
- Facility (категория источника): например,
- Транспорт: syslog поддерживает передачу по сети (UDP/TCP, обычно порт 514) и локальное хранение в файлах.
💡 Совет: В современных дистрибутивах по умолчанию используется
rsyslog— это быстрая и расширяемая реализация с поддержкой TLS, фильтрации и модулей. Для понимания основ достаточно её.
Шаг 2: Установка и запуск rsyslog
Хотя rsyslog часто предустановлен, проверьте его наличие и установите при необходимости.
Для Debian/Ubuntu:
sudo apt update
sudo apt install rsyslog
Для RHEL/CentOS (8+):
sudo dnf install rsyslog # или sudo yum на более старых версиях
После установки запустите и включите демон в автозагрузку:
sudo systemctl enable --now rsyslog
Проверьте статус:
systemctl status rsyslog
Вы должны увидеть active (running). Если демон не запущен, выполните sudo systemctl start rsyslog.
Шаг 3: Основы конфигурации
Основной конфигурационный файл — /etc/rsyslog.conf. Откройте его для просмотра (например, sudo nano /etc/rsyslog.conf). Обратите внимание на следующие элементы:
- Модули: в начале файла могут быть загружены модули (например,
module(load="imuxsock")для поддержки локальных сокетов). - Глобальные директивы: такие как
$FileOwner syslog,$FileGroup adm(владельцы лог-файлов). - Правила (селекторы и действия): строки вида:
Это правило означает: все сообщения с severity*.info;mail.none;authpriv.none;cron.none /var/log/messagesinfoи выше (из всех facility, кромеmail,authpriv,cron) записывать в файл/var/log/messages.
Синтаксис правила: <селектор> <действие>
- Селектор:
facility.severity(например,auth.err), можно использовать wildcards*(все facility) и комбинации через;. - Действие: путь к файлу (начинается с
/), удалённый сервер (@serverдля UDP,@@serverдля TCP), команда (через|), база данных и т.д.
⚠️ Важно: После любых изменений в конфигурации перезагрузите rsyslog:
sudo systemctl restart rsyslog. Для проверки синтаксиса используйтеsudo rsyslogd -N1(тестовый запуск без фактического запуска).
Шаг 4: Создание собственного правила логирования
Допустим, вы хотите логировать сообщения от вашего приложения, которое использует facility local0, в отдельный файл /var/log/myapp.log.
- Создайте отдельный конфигурационный файл в
/etc/rsyslog.d/(рекомендуется для пользовательских правил, чтобы не изменять основной файл):sudo nano /etc/rsyslog.d/myapp.conf - Добавьте строку:
local0.* /var/log/myapp.log
Это правило перенаправляет все сообщения с facilitylocal0(любого severity) в указанный файл. - Создайте файл лога и установите корректные права (rsyslog обычно сам создаёт файл при первом обращении, но можно предварительно):
sudo touch /var/log/myapp.log sudo chown syslog:adm /var/log/myapp.log #владелец и группа могут отличаться (например, `root:syslog`) sudo chmod 640 /var/log/myapp.log - Перезагрузите rsyslog:
sudo systemctl restart rsyslog
Шаг 5: Тестирование с командой logger
Используйте утилиту logger для отправки тестовых сообщений в syslog. Она позволяет указать facility и severity.
Отправьте сообщение с facility local0 и severity info:
logger -p local0.info "Тестовое сообщение от моего приложения"
Проверьте, появилось ли оно в логе:
tail -f /var/log/myapp.log
Вы должны увидеть строку, похожую на:
Feb 15 10:30:00 hostname username: Тестовое сообщение от моего приложения
Если сообщение не появилось:
- Убедитесь, что правило в
myapp.confкорректно (без опечаток). - Проверьте, что rsyslog перезапущен.
- Убедитесь, что ваше приложение действительно использует facility
local0(возможно, нужно настроить само приложение, например, в конфигурационном файле или коде).
Шаг 6: Просмотр, анализ и ротация логов
Просмотр и анализ логов
Для мониторинга и поиска в логах используйте:
- tail: следить за последними строками в реальном времени.
tail -f /var/log/myapp.log # следить за вашим логом tail -f /var/log/syslog | grep "error" # фильтровать по ключевому слову - grep: поиск по шаблону.
grep "local0" /var/log/syslog - journalctl: если система использует systemd-journald, он может показывать как свои логи, так и те, что перенаправлены из rsyslog (если настроено).
journalctl -u rsyslog -f # следить за логами самого rsyslog journalctl -f | grep "local0" # фильтровать по facility
💡 Совет: Для сложного анализа (статистика, графики) рассмотрите инструменты вроде
awk,sedили системы ELK (Elasticsearch, Logstash, Kibana) или Graylog.
Ротация логов
С течением времени файлы логов могут вырасти до огромных размеров. Ротация автоматически архивирует старые логи и создаёт новые.
Rsyslog часто интегрируется с logrotate. Конфигурация для стандартных логов обычно в /etc/logrotate.d/rsyslog:
/var/log/syslog
/var/log/mail.log
/var/log/kern.log
/var/log/auth.log
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Ключевые параметры:
rotate 4: хранить 4 архивных файла (например,syslog.1,syslog.2.gzи т.д.).weekly: ротация каждую неделю (можноdaily,monthly).compress: сжимать архивы gzip.postrotate: скрипт после ротации, который уведомляет rsyslog о переименовании файлов (важно для корректного продолжения логирования).
Для вашего кастомного лога /var/log/myapp.log добавьте отдельный блок в тот же файл или создайте новый в /etc/logrotate.d/:
/var/log/myapp.log {
rotate 12
monthly
compress
delaycompress
missingok
notifempty
create 640 syslog adm
}
Протестировать ротацию можно вручную:
sudo logrotate -f /etc/logrotate.conf # принудительная ротация
Проверка результата
После выполнения всех шагов убедитесь, что настройка работает корректно:
- Демон rsyslog активен:
systemctl is-active rsyslogдолжен вернутьactive. - Лог-файл существует и доступен:
ls -l /var/log/myapp.log. - Тестовое сообщение записывается: снова выполните
logger -p local0.info "Ещё одно тестовое сообщение"и проверьтеtail -f /var/log/myapp.log. - Ротация настроена: проверьте конфигурацию logrotate (
sudo cat /etc/logrotate.d/rsyslogи ваш файл) и убедитесь, что параметры соответствуют требованиям. - Нет ошибок в логах rsyslog:
grep -i error /var/log/syslog(илиjournalctl -u rsyslog).
Если все пункты выполнены, вы успешно настроили syslog для своего приложения и научились работать с системными логами.
Возможные проблемы
- Ошибка доступа при записи в лог-файл: Убедитесь, что rsyslog имеет права на запись. Проверьте владельца и права файла (
ls -l /var/log/myapp.log). Обычно файлы логов должны принадлежать группеadmилиsyslogи иметь права640. Если файл создан вручную, используйтеsudo chown syslog:adm /var/log/myapp.logиsudo chmod 640 /var/log/myapp.log. - Сообщения не попадают в лог: Проверьте синтаксис конфигурационного файла с помощью
sudo rsyslogd -N1(вывод покажет ошибки). Убедитесь, что facilitylocal0используется вашим приложением (иногда нужно явно указать в конфигурации приложения, например,local0вsyslog-настройках). Также проверьте, что правило загружено (файл в/etc/rsyslog.d/имеет расширение.conf). - Конфликт с systemd-journald: Если journald настроен на хранение логов (
Storage=persistentв/etc/systemd/journald.conf), он может перехватывать сообщения до rsyslog. Убедитесь, что вjournald.confустановленоForwardToSyslog=yes(по умолчанию частоyes). После изменений перезапустите journald:sudo systemctl restart systemd-journald. - Логи не ротируются: Проверьте, что конфигурация logrotate включает ваш файл (файл в
/etc/logrotate.d/). Убедитесь, что скриптpostrotateкорректно уведомляет rsyslog (путь/usr/lib/rsyslog/rsyslog-rotateможет отличаться; на некоторых системах это/usr/sbin/rsyslog-rotate). Запуститеsudo logrotate -d /etc/logrotate.confдля тестового прогона без применения. - Много ненужных сообщений в логах: Настройте более точные селекторы. Например, вместо
local0.*используйтеlocal0.warnдля только предупреждений и ошибок. Или исключите ненужные facility через;(как в примере с/var/log/messages).