Журналирование и анализ логов: journalctl, rsyslog, logrotate

TIP

Эта статья — часть серии Linux administration, посвящённой самостоятельному администрированию Linux, Self-Hosting и DevOps. Логи — это “чёрный ящик” вашей системы. Умение их читать и анализировать критически важно для диагностики, безопасности и стабильности.

📌 О чём эта статья?

Логи — основной источник информации о работе системы. Когда что-то идёт не так, логи — первое, куда нужно смотреть.

В этой статье вы узнаете:

  • Как устроено журналирование в Linux
  • Как использовать journalctl (systemd)
  • Как настроить централизованный сбор логов с rsyslog
  • Как предотвратить переполнение диска с logrotate
  • Практические примеры фильтрации, анализа и архивации

🧩 Как работает журналирование в Linux?

Linux использует несколько уровней логирования:

  1. Ядро — события на уровне железа и драйверов
  2. Системные службыsystemd, sshd, nginx и др.
  3. Приложения — веб-серверы, базы данных, пользовательские скрипты

Для сбора и обработки логов используются:

  • systemd-journald — бинарный журнал от systemd
  • rsyslog — классический демон системного логирования
  • logrotate — утилита ротации логов

INFO

journald работает из коробки. rsyslog — расширяет возможности (сетевой сбор, фильтрация).
Источник: systemd — The Journal


📚Журналы в Linux: Обзор

Журналы содержат подробности о всех происходящих в системе процессах и её состоянии. Большинство лог-файлов в Linux традиционно находятся в каталоге /var/log.

Типичные примеры файлов журналов включают:

  • /var/log/apache2/ — журналы доступа и ошибок для веб-сервера Apache.
  • /var/log/auth.log — сведения о входе пользrователя в систему, привилегированном доступе и удаленной проверке подлинности.
  • /var/log/kern.log — журналы ядра.
  • /var/log/messages — общая некритическая системная информация. В некоторых современных дистрибутивах, как Fedora, файл /var/log/messages может отсутствовать, и сообщения напрямую управляются systemd-journald.
  • /var/log/syslog — общие системные журналы.
  • /var/log/audit/audit.log — журналы демона аудита auditd.
  • /var/log/maillog — журналы почтовой системы.
  • /var/log/yum.log — журналы управления пакетами RPM.

Для получения дополнительной информации о расположении лог-файлов в большинстве дистрибутивов Linux можно обратиться к файлам /etc/syslog.conf или /etc/rsyslog.conf.


🔍 journalctl — работа с systemd-журналом

journalctl — интерфейс к systemd journal, который хранит логи в бинарном формате с метаданными (PID, UID, команда, время).

В современных дистрибутивах Linux, таких как Fedora, Ubuntu, CentOS и openSUSE, используется система инициализации systemd. systemd-journald — это демон, который выполняет большинство функций, связанных с регистрацией событий, и является частью журнала systemd. Он призван заменить другие подсистемы журналирования в Linux.

Особенности systemd-journald:

  • Двоичный формат: в отличие от syslog, который обычно сохраняет сообщения в текстовых файлах, systemd-journald хранит их в двоичном формате. Все атрибуты сообщений автоматически индексируются, что делает поиск проще и быстрее.
  • Источники сообщений: журнал собирает и индексирует сообщения из нескольких источников, включая сокет /dev/log (для программного обеспечения, отправляющего сообщения согласно соглашениям Syslog), файл устройства /dev/kmsg (для сообщений ядра Linux, заменяя традиционный процесс klogd), а также сокеты /run/systemd/journal/stdout и /run/systemd/journal для сервисного программного обеспечения.
  • Настройки хранения: опция Storage в конфигурации systemd-journald определяет, следует ли сохранять журнал на диск. Возможные значения: volatile (только в памяти), persistent (сохраняет в /var/log/journal/, создавая каталог при необходимости), auto (сохраняет в /var/log/journal/, но не создает каталог, это значение по умолчанию) и none (удаляет все данные журнала). По умолчанию auto означает, что журнал не сохраняется между перезагрузками, если каталог /var/log/journal не создан.

🔹 Основные команды

journalctl                    # Все логи (самые старые сначала)
journalctl -f                 # Следить за логами в реальном времени (аналог `tail -f`)
journalctl -n 50              # Последние 50 строк
journalctl --since "1 hour ago"
journalctl --until "10:00"
journalctl --since yesterday

🔹 Фильтрация по службе

journalctl -u nginx.service           # Логи Nginx
journalctl -u ssh.service             # Логи SSH
journalctl -u docker.service -f       # Следить за Docker

🔹 Фильтрация по процессу, пользователю, пути

journalctl _PID=1234                  # По PID
journalctl _UID=1000                  # По UID
journalctl /usr/bin/nginx             # По исполняемому файлу

🔹 Фильтрация по уровню приоритета (priority)

УровеньЗначениеОписание
emerg (0)--priority=0Система неработоспособна
alert (1)--priority=1Требует немедленного вмешательства
err (3)--priority=3Ошибки
warning (4)--priority=4Предупреждения
notice (5)--priority=5Уведомления
info (6)--priority=6Информационные сообщения
debug (7)--priority=7Отладка

Пример:

journalctl -p err                    # Только ошибки и выше
journalctl -u nginx.service -p 3     # Ошибки Nginx

🔹 Вывод в удобных форматах

journalctl -o json                   # JSON (для парсинга)
journalctl -o short-iso              # ISO-дата
journalctl -o cat                    # Только сообщение (без метаданных)
journalctl -o verbose                # Полная информация

🔹 Сохранение и экспорт

journalctl > system.log              # Сохранить в файл
journalctl -o json | jq .            # Красивый JSON с `jq`

INFO

Чтобы логи сохранялись после перезагрузки, создайте директорию:

sudo mkdir -p /var/log/journal

Источник: Persistent Storage в systemd


📡 rsyslog — расширенное системное логирование

Rsyslog — это полнофункциональная система регистрации событий, которая пришла на смену оригинальному демону syslogd в системах Linux. Она расширяет возможности исходной системы Syslog, но сохраняет обратную совместимость с программным интерфейсом.

Функции Rsyslog:

  • Гибкость: позволяет сортировать сообщения по источникам (facility) и уровню важности (severity), а также направлять их в различные пункты назначения: в журнальные файлы, на терминалы пользователей и даже на другие компьютеры.
  • Централизованное журналирование: одна из самых ценных особенностей Rsyslog — это её способность централизовать процедуру регистрации событий в сети, что удобно для управления и просмотра файлов журналов с множества систем, а также обеспечивает важное преимущество в безопасности.
  • Архитектура: сообщения журнала можно представить как поток событий, а Rsyslog — как механизм обработки этого потока. Сообщения, интерпретируемые как события, принимаются в качестве входов, обрабатываются фильтрами и пересылаются по адресу назначения. Каждый из этих этапов является конфигурируемым и модульным.

Конфигурация Rsyslog:

  • Основной файл конфигурации — /etc/rsyslog.conf.
  • Конфигурация может включать дополнительные файлы из каталога /etc/rsyslog.d/*.conf, которые обрабатываются в лексикографическом порядке.
  • Правила в файле rsyslog.conf имеют формат селектор действие, где селектор отделен от действия пробелами или табуляцией. Селектор состоит из источника (facility) и уровня важности (severity).
  • Перезагрузка конфигурации: после внесения изменений в конфигурационный файл rsyslog необходимо отправить демону rsyslogd сигнал HUP для перезагрузки настроек, используя его PID (например, sudo kill -HUP 'cat /var/run/syslogd.pid').

🔹 Установка

# Debian/Ubuntu
sudo apt install rsyslog
 
# RHEL/Fedora
sudo dnf install rsyslog

🔹 Конфигурация: /etc/rsyslog.conf и /etc/rsyslog.d/

Пример правила:

# Логи уровня err и выше → в отдельный файл
*.err /var/log/errors.log
 
# Логи службы nginx → в свой файл
:programname, isequal, "nginx" /var/log/nginx/rsyslog.log
 
# Отправлять логи на удалённый сервер
*.* @192.168.1.100:514

TIP

Используйте /etc/rsyslog.d/50-myapp.conf для пользовательских правил.

🔹 Включение сетевого приёма (сервер)

# /etc/rsyslog.d/50-server.conf
module(load="imtcp")
input(type="imtcp" port="514")
 
module(load="imudp")
input(type="imudp" port="514")

Перезапустите:

sudo systemctl restart rsyslog

🔹 Протоколы

  • UDP: быстрее, но без гарантии доставки
  • TCP: надёжнее, с подтверждением

INFO

rsyslog поддерживает TLS, буферизацию, базы данных и фильтрацию на лету.
Источник: rsyslog — Official Documentation


🔄 logrotate — ротация логов

Logrotate — это утилита, предназначенная для ротации, сжатия и удаления старых файлов журналов.

Цель Logrotate:

  • Предотвращение переполнения диска: журналы в Linux могут разрастаться до неприличных размеров, что приводит к снижению производительности и в некоторых случаях может вызвать переполнение дискового пространства. Logrotate предотвращает эту проблему.
  • Автоматизация: обеспечивает автоматическое архивирование и удаление старых журналов по достижении определенного размера или по истечении заданного времени.
  • Гибкость: при правильной настройке файл журнала никогда не разрастется до огромных размеров.

Работа Logrotate:

  • Logrotate запускается с помощью планировщика cron. В простейшей конфигурации системы FreeBSD файл /etc/crontab содержит строку, которая запускает утилиту newsyslog (аналог logrotate в FreeBSD) каждый час.
  • Конфигурационные файлы для logrotate обычно находятся в /etc/logrotate.conf и в подкаталоге /etc/logrotate.d/.
  • Важно, что при попытке сжать или выполнить ротацию журнального файла, который был открыт демоном rsyslogd для записи, необходимо отправить сигнал HUP демону rsyslogd, чтобы избежать непредсказуемых результатов.

🔹 Как работает?

logrotate:

  • Регулярно (ежедневно) проверяет размер логов
  • “Поворачивает” старый лог: переименовывает в app.log.1, создаёт новый
  • Сжимает старые логи (app.log.1.gz)
  • Удаляет логи старше N дней

🔹 Конфигурация: /etc/logrotate.conf и /etc/logrotate.d/

Пример для Nginx:

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        systemctl reload nginx > /dev/null 2>&1 || true
    endscript
}

🔹 Объяснение опций

ОпцияЗначение
dailyРотация раз в день
weekly, monthlyАльтернативы
rotate 14Хранить 14 архивов
compressСжимать старые логи
delaycompressНе сжимать последний архив
missingokНе ошибка, если файла нет
notifemptyНе ротировать пустые файлы
createСоздавать новый файл с правами
postrotate / endscriptКоманда после ротации (например, перезагрузка службы)

🔹 Тестирование

# Протестировать конфиг
sudo logrotate -d /etc/logrotate.conf
 
# Принудительный запуск (для теста)
sudo logrotate -f /etc/logrotate.d/nginx

INFO

logrotate запускается через cron (обычно /etc/cron.daily/logrotate).


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

Пример 1: Диагностика сбоя SSH

journalctl -u ssh.service --since "1 hour ago" -p err

Ищем:

  • Failed password
  • Connection closed
  • Too many authentication failures

Пример 2: Централизованный сбор логов

На сервере (192.168.1.100):

# /etc/rsyslog.d/50-central.conf
module(load="imtcp" port="514")
*.* /var/log/remote/%HOSTNAME%/syslog.log

На клиенте:

# /etc/rsyslog.d/50-forward.conf
*.* @192.168.1.100:514

Пример 3: Настройка ротации для пользовательского приложения

# /etc/logrotate.d/myapp
/home/alice/myapp/logs/*.log {
    weekly
    rotate 8
    compress
    missingok
    notifempty
    create 0644 alice alice
}

⚠️ Типичные проблемы и решения

ПроблемаРешение
journalctl: No journal files were foundСоздайте /var/log/journal
Логи быстро заполняют дискНастройте logrotate или ограничьте размер журнала в journald.conf
rsyslog не слушает портПроверьте netstat -tuln | grep 514, настройки модулей
logrotate не работаетЗапустите вручную с -d для дебага
Логи в UTC, а не в локальном времениУбедитесь, что timedatectl set-local-rtc 0 и часовой пояс настроен

📊 Полезные команды диагностики

# Где хранятся логи?
ls /var/log/
 
# Кто потребляет больше всего места?
sudo du -sh /var/log/* | sort -hr | head -10
 
# Проверить статус rsyslog
systemctl status rsyslog
 
# Проверить, слушает ли rsyslog порт
sudo ss -tuln | grep 514
 
# Посмотреть последние ошибки в системе
journalctl -p 3 -b -1     # Ошибки в предыдущей загрузке

✅ Заключение

Теперь вы можете:

  • Читать и фильтровать логи с journalctl
  • Настроить централизованный сбор с rsyslog
  • Автоматически ротировать логи с logrotate
  • Диагностировать проблемы и предотвращать переполнение диска

QUOTE

“Логи — это память системы. Без них вы слепы.”