Системное логирование [108.2]

Рейтинг: 80.6% · 16 голосов
Полный курс LPIC-1 (экзамены 101-500 и 102-500): архитектура, загрузка, пакеты, команды и текст, ФС и права, шелл-скрипты, пользователи, сервисы, сеть, безопасность. Debian и RHEL.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Системное логирование [108.2]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-1 и как устроен путь администратора
  2. Железо, устройства и модули ядра [101.1]
  3. Загрузка системы: от BIOS до systemd [101.2]
  4. systemd, цели и уровни выполнения [101.3]
  5. План разметки диска и swap [102.1]
  6. Загрузчик GRUB 2 [102.2]
  7. Разделяемые библиотеки [102.3]
  8. Управление пакетами в Debian: dpkg и apt [102.4]
  9. Управление пакетами RPM, DNF и Zypper [102.5]
  10. Linux как гость виртуализации [102.6]
  11. Командная строка Bash [103.1]
  12. Обработка текста фильтрами [103.2]
  13. Базовое управление файлами [103.3]
  14. Потоки, конвейеры и перенаправление [103.4]
  15. Процессы: создание, мониторинг, сигналы [103.5]
  16. Приоритеты выполнения процессов [103.6]
  17. Регулярные выражения [103.7]
  18. Редактор vi и vim [103.8]
  19. Разделы и создание файловых систем [104.1]
  20. Целостность и обслуживание ФС [104.2]
  21. Монтирование файловых систем [104.3]
  22. Урок 21. Права доступа и владение: rwx, chmod, umask и специальные биты
  23. Жёсткие и символические ссылки
  24. FHS и поиск файлов в системе [104.7]
  25. Окружение и кастомизация оболочки [105.1]
  26. Урок 25. Написание простых bash-скриптов [105.2]
  27. Графика, рабочие столы и доступность
  28. Учётные записи пользователей и групп
  29. Автоматизация задач: cron, at, таймеры [107.2]
  30. Локализация и интернационализация [107.3]
  31. Системное время и синхронизация [108.1]
  32. Системное логирование [108.2] (вы здесь)
  33. Основы почтового агента (MTA) [108.3]
  34. Печать и CUPS [108.4]
  35. Основы интернет-протоколов [109.1]
  36. Постоянная конфигурация сети [109.2]
  37. Диагностика сети [109.3]
  38. DNS на стороне клиента [109.4]
  39. Задачи администрирования безопасности [110.1]
  40. Настройка безопасности хоста [110.2]
  41. Шифрование данных: SSH и GnuPG [110.3]
Урок 31. Системное логирование [108.2]

Когда что-то ломается ночью, администратор не гадает - он идет в логи. Эта глава про то, как Linux собирает сообщения о событиях: классический демон rsyslog с его системой facility/priority, бинарный журнал journald от systemd и ротацию logrotate, чтобы диски не переполнялись. Разберем, где физически лежат логи, как их читать и почему на современной системе одно и то же сообщение часто попадает сразу в два места.

Изображение

Как это работает

Идея syslog родилась еще в 80-х: любая программа отправляет короткое сообщение демону логирования, а тот сам решает, куда его записать. Чтобы демон мог сортировать поток, у каждого сообщения есть два атрибута. Facility - это категория источника: kern (ядро), auth и authpriv (вход в систему, sudo), mail, cron, daemon, и восемь свободных local0-local7 для своих приложений. Priority (он же severity) - это важность: от debug (самое мелкое) через info, notice, warning, err, crit, alert до emerg (система умирает). Связка facility.priority и есть язык, на котором пишутся правила маршрутизации.

В rsyslog правило выглядит как selector + action. Селектор mail.err означает категорию mail и приоритет err И ВЫШЕ. Действие - чаще всего путь к файлу. То есть строка mail.err /var/log/mail.err читается как все письма уровня err и серьезнее пиши в этот файл. Важно понимать накопительную логику: указав err, вы поймаете также crit, alert, emerg. Чтобы взять ровно один уровень, ставят знак равенства: mail.=info.

journald - это другой подход. Демон systemd-journald пишет не в текст, а в структурированный бинарный журнал. Каждая запись несет десятки полей: какой юнит ее породил, PID, UID, имя загрузки (boot ID), точное время. Поэтому фильтровать можно не грепом, а по полям. Минус бинарного формата - его не прочитать обычным cat, нужен journalctl. Плюс - надежность, индексация и связь сообщения с конкретным сервисом systemd.

На современной системе работают оба механизма сразу. journald получает сообщения первым (от ядра, от сервисов, из сокета /dev/log), а потом может переслать их дальше в rsyslog через сокет /run/systemd/journal/syslog. Так получается, что вы видите событие и в journalctl, и в текстовом /var/log/syslog. Это не баг, а штатная связка для совместимости со старыми инструментами разбора логов.

Команды и примеры

Маршрутизация в rsyslog задается в /etc/rsyslog.conf и подключаемых файлах из /etc/rsyslog.d/. Несколько типовых правил:

Код: Выделить всё

# все ошибки уровня err и выше - в один файл
*.err                       /var/log/errors.log
# только аутентификация (вход, sudo, su)
auth,authpriv.*             /var/log/auth.log
# ровно info из cron, ни выше ни ниже
cron.=info                  /var/log/cron-info.log
# исключить debug из общего потока
*.*;mail.none;authpriv.none /var/log/messages
# отправка на удаленный сервер по TCP
*.* @@logserver.local:514
Один @ - это UDP, два @@ - TCP. После правки перезапускаем демон: systemctl restart rsyslog. Проверить генерацию сообщения можно утилитой logger:

Код: Выделить всё

logger -p auth.warning "тестовая запись от админа"
Теперь journald. Базовые приемы journalctl, которые надо знать на экзамене:

Код: Выделить всё

journalctl -u sshd.service     # только юнит sshd
journalctl -b                  # с текущей загрузки
journalctl -b -1               # с предыдущей загрузки
journalctl -p err              # приоритет err и выше
journalctl -f                  # хвост в реальном времени (как tail -f)
journalctl --since "2026-06-13 09:00" --until "10:00"
journalctl -k                  # только сообщения ядра (dmesg)
journalctl -u nginx -p warning --since today
По умолчанию во многих дистрибутивах журнал живет в памяти (/run/log/journal) и теряется при перезагрузке. Чтобы сделать его персистентным, создаем каталог и перезапускаем демон:

Код: Выделить всё

mkdir -p /var/log/journal
systemctl restart systemd-journald
journalctl --disk-usage         # сколько занято
journalctl --vacuum-time=2weeks # удалить старше двух недель
Ротация текстовых логов - забота logrotate. Глобальный конфиг /etc/logrotate.conf, а правила для конкретных сервисов раскладываются по /etc/logrotate.d/. Пример своего правила:

Код: Выделить всё

/var/log/myapp/*.log {
    weekly
    rotate 8
    compress
    delaycompress
    missingok
    notifempty
    create 0640 myapp myapp
    postrotate
        systemctl reload myapp >/dev/null 2>&1 || true
    endscript
}
rotate 8 хранит восемь архивов, compress жмет gzip, delaycompress откладывает сжатие на цикл (полезно, если демон еще пишет в старый файл). Прогон вручную и тест:

Код: Выделить всё

logrotate -d /etc/logrotate.conf   # debug, ничего не меняет
logrotate -f /etc/logrotate.d/myapp # форсировать ротацию
Где искать логи в /var/log: в Debian/Ubuntu это syslog, auth.log, kern.log, dpkg.log; в RHEL/Fedora - messages, secure, cron, dnf.log. Имена разные, но смысл тот же. journald сам не зависит от семейства дистрибутива.

Частые грабли
  • Забыли, что priority накопительный: написали warning, а удивляетесь записям уровня crit. Для точного уровня нужен знак равенства.
  • Журнал journald непостоянный: после reboot пропали логи аварии. Каталог /var/log/journal не создан или Storage=volatile в /etc/systemd/journald.conf.
  • logrotate ротирует, но демон продолжает писать в старый inode и новый файл пустой. Решение - copytruncate или сигнал/reload в postrotate.
  • Запутались в дублях: одно сообщение в journalctl и в /var/log/syslog. Это связка journald to rsyslog через ForwardToSyslog, а не ошибка.
  • Правка rsyslog.conf без перезапуска демона - изменения не подхватываются, нужен systemctl restart rsyslog.
  • journalctl показывает старое локальное время после смены таймзоны - журнал хранит UTC, отображение зависит от настроек системы.
Мини-лаба
  • Сделайте journald персистентным: создайте /var/log/journal, перезапустите systemd-journald, перезагрузите стенд и проверьте journalctl -b -1.
  • Сгенерируйте сообщение: logger -p local0.info "lab test" и найдите его через journalctl и в текстовом логе.
  • Создайте /etc/rsyslog.d/90-lab.conf с правилом local0.* /var/log/lab.log, перезапустите rsyslog, повторите logger и убедитесь, что файл появился.
  • Найдите все сообщения уровня err и выше за сегодня: journalctl -p err --since today.
  • Напишите правило logrotate для /var/log/lab.log (rotate 3, daily, compress) и форсируйте ротацию ключом -f, посмотрите на результат в каталоге.
  • Ограничьте размер журнала: journalctl --vacuum-size=50M и сверьте journalctl --disk-usage.
Контрольные вопросы
  • Чем отличается селектор mail.info от mail.=info в rsyslog?
  • Какой ключ journalctl покажет сообщения только от предыдущей загрузки системы и какой - только от ядра?
  • Что физически нужно сделать, чтобы журнал journald пережил перезагрузку?
  • Зачем в правиле logrotate директива delaycompress и в каком случае нужен copytruncate?
  • Через какой механизм сообщение попадает одновременно в journald и в /var/log/syslog?
  • Перечислите приоритеты syslog от самого низкого до самого высокого.
👍2 ❤️3 🔥2 😄 🤔4
Аватара пользователя
thickt
Сообщения: 1
Зарегистрирован: 24 май 2026, 18:48

Re: Системное логирование [108.2]

Сообщение thickt »

А если journald уже пишет на диск, rsyslog вообще нужен? У меня messages и journalctl показывают одно и то же, диск жалко.
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
juniorcoredump
Сообщения: 1
Зарегистрирован: 04 июн 2026, 00:11

Re: Системное логирование [108.2]

Сообщение juniorcoredump »

Поймал грабли с logrotate: ротация идет, а nginx льет в старый файл, новый пустой. Помог copytruncate, спасибо за подсказку.
👍1 ❤️2 🔥1 😄 🤔
Ответить
← Предыдущая глава
Системное время и синхронизация [108.1]
Следующая глава →
Основы почтового агента (MTA) [108.3]

Все главы курса «LPIC-1: администратор Linux (101 + 102)»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «LPIC-1: администратор Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость