middle
Как устроено логирование в Linux?
В Linux несколько подсистем логирования дополняют друг друга: systemd-journald собирает структурированные логи в бинарном формате, а rsyslog пишет текстовые файлы в /var/log/.
systemd-journald (основная система в Ubuntu 24.04)
Собирает логи от:
- Сервисов, управляемых systemd
- Ядра (kernel messages)
- Syslog-сообщений
- stdout/stderr процессов
Логи хранятся в бинарном формате в /var/log/journal/. Просмотр — через journalctl.
rsyslog (syslog)
Традиционный демон логирования. Конфигурация: /etc/rsyslog.conf и /etc/rsyslog.d/. Записывает текстовые файлы в /var/log/.
Основные лог-файлы в /var/log/
| Файл | Содержимое |
|---|---|
/var/log/syslog |
Основной системный лог (в Ubuntu) |
/var/log/auth.log |
Аутентификация: логины, sudo, ssh |
/var/log/kern.log |
Сообщения ядра |
/var/log/dpkg.log |
Операции с пакетами (dpkg/apt) |
/var/log/nginx/ |
Логи Nginx (access.log, error.log) |
logrotate — ротация логов
Предотвращает бесконтрольный рост лог-файлов. Конфигурация: /etc/logrotate.conf и /etc/logrotate.d/.
Пример конфигурации logrotate
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily # Ротация ежедневно
rotate 14 # Хранить 14 файлов
compress # Сжимать старые логи
delaycompress # Не сжимать текущий файл
missingok # Не выдавать ошибку, если файл отсутствует
notifempty # Не ротировать пустые файлы
create 0640 appuser appuser # Создать новый файл с правами
postrotate
systemctl reload myapp # Действие после ротации
endscript
}
Полезные команды для работы с логами
Пример
# Последние записи syslog
tail -f /var/log/syslog
# Поиск ошибок в логах
grep -i error /var/log/syslog
# Логи сервиса через journalctl
journalctl -u myapp.service -f
# Логи ядра
dmesg -T # С человекочитаемыми временными метками
# Объём логов journald
journalctl --disk-usage
# Очистка старых логов journald
sudo journalctl --vacuum-time=7d # Удалить старше 7 дней
sudo journalctl --vacuum-size=500M # Ограничить объём 500 МБ
На собеседовании: интервьюер хочет убедиться, что вы умеете находить логи на сервере. Ключевое — знать
/var/log/syslogиjournalctl -u <service> -f. Частая ошибка — не упомянуть logrotate, из-за отсутствия которого логи могут заполнить весь диск.