Перейти к основному содержимому
Вернуться в категорию

Управление журналами: предотвращение заполнения диска с logrotate

Важные расположения журналов, настройка logrotate, ограничения размера journald, поиск больших файлов журналов и основы анализа журналов на Linux-серверах.

Время чтения: 11 мин Управление сервером
logrotateуправление журналамиjournaldдисковое пространствоsysloglinuxанализ журналов

Содержание

Управление журналами: предотвращение заполнения диска с logrotate

Файлы журналов незаменимы для диагностики системных проблем и мониторинга событий безопасности. Однако без управления они могут заполнить дисковое пространство и вызвать сбои системы. В этом руководстве рассматриваются важные расположения журналов, настройка logrotate, управление размером journald и поиск больших файлов журналов.

Важные расположения журналов

Системные файлы журналов

hljs bash
# Основная директория системных журналов
ls -lh /var/log/

# Важные файлы журналов:
# /var/log/syslog          — Общие системные сообщения (Debian/Ubuntu)
# /var/log/messages        — Общие системные сообщения (RHEL/CentOS)
# /var/log/auth.log        — Журналы аутентификации (Debian/Ubuntu)
# /var/log/secure          — Журналы аутентификации (RHEL/CentOS)
# /var/log/kern.log        — Сообщения ядра
# /var/log/cron            — Журналы cron-задач
# /var/log/mail.log        — Журналы почтового сервера

Файлы журналов приложений

hljs bash
# Журналы веб-сервера
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/apache2/access.log
/var/log/apache2/error.log

# Журналы баз данных
/var/log/mysql/error.log
/var/log/postgresql/

Мониторинг файлов журналов

hljs bash
# Мониторинг журналов в реальном времени
tail -f /var/log/syslog
tail -f /var/log/nginx/access.log

# Последние 100 строк
tail -n 100 /var/log/auth.log

# Поиск по ключевому слову
grep "ERROR" /var/log/nginx/error.log
grep "Failed password" /var/log/auth.log

# Поиск в нескольких файлах
grep -r "error" /var/log/nginx/

Анализ дискового пространства

Поиск больших файлов журналов

hljs bash
# Найти наибольшие файлы в /var/log
du -sh /var/log/* | sort -rh | head -20

# Найти большие файлы в системе (100МБ+)
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null

# Файлы больше 50МБ в /var/log
find /var/log -type f -size +50M -exec ls -lh {} \;

# Проверить использование диска
df -h

# Просмотр размеров директорий
du -sh /var/log/
du -sh /var/log/* | sort -rh

Настройка logrotate

logrotate — инструмент, автоматически ротирующий, сжимающий и удаляющий файлы журналов.

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

hljs bash
# logrotate обычно запускается ежедневно через cron
cat /etc/cron.daily/logrotate

# Запустить вручную
sudo logrotate /etc/logrotate.conf

# Режим симуляции (без реальных операций)
sudo logrotate --debug /etc/logrotate.conf

# Принудительная ротация
sudo logrotate --force /etc/logrotate.d/nginx

Основная конфигурация logrotate

hljs bash
# Основной файл конфигурации
sudo nano /etc/logrotate.conf
hljs bash
# Настройки по умолчанию
weekly          # Ротация еженедельно
rotate 4        # Хранить 4 старые версии
create          # Создавать новый файл после ротации
compress        # Сжимать старые журналы
delaycompress   # Не сжимать последний ротированный журнал
include /etc/logrotate.d  # Включить конфигурации приложений

Конфигурация logrotate для конкретного приложения

hljs bash
# Конфигурация logrotate для Nginx
sudo nano /etc/logrotate.d/nginx
hljs bash
/var/log/nginx/*.log {
    daily           # Ротация ежедневно
    missingok       # Не ошибаться если файл отсутствует
    rotate 14       # Хранить 14 дней журналов
    compress        # Сжимать
    delaycompress   # Не сжимать последний
    notifempty      # Не ротировать пустые файлы
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

logrotate для пользовательского приложения

hljs bash
sudo nano /etc/logrotate.d/myapp
hljs bash
/var/log/myapp/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0644 www-data www-data
    dateext
    dateformat -%Y%m%d
    postrotate
        systemctl reload myapp 2>/dev/null || true
    endscript
}

Управление размером journald

hljs bash
# Проверить текущий размер журнала
journalctl --disk-usage

# Очистить старые журналы (старше 2 недель)
sudo journalctl --vacuum-time=2weeks

# Очистить с ограничением размера
sudo journalctl --vacuum-size=500M

# Хранить определённое количество файлов
sudo journalctl --vacuum-files=5

Постоянная конфигурация journald

hljs bash
# Редактировать файл конфигурации journald
sudo nano /etc/systemd/journald.conf
hljs ini
[Journal]
# Максимальное использование диска
SystemMaxUse=500M

# Минимальное свободное место на диске
SystemKeepFree=1G

# Максимальный размер файла
SystemMaxFileSize=50M

# Период хранения журналов
MaxRetentionSec=2weeks

# Сжатие
Compress=yes

# Постоянное хранение
Storage=persistent
hljs bash
# Применить конфигурацию
sudo systemctl restart systemd-journald

Основы анализа журналов

hljs bash
# Анализ журналов ошибок Nginx
grep -c "error" /var/log/nginx/error.log
grep "error" /var/log/nginx/error.log | tail -20

# Обнаружение попыток брутфорса SSH
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -10

# Найти IP с наибольшим количеством запросов
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# Подсчёт HTTP-кодов состояния
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# Фильтрация ошибок из journald
journalctl -p err --since "1 hour ago"

Экстренная ситуация: диск заполнен

hljs bash
# Быстрое реагирование при заполненном диске

# 1. Проверить состояние диска
df -h

# 2. Найти наибольшие файлы
du -sh /var/log/* | sort -rh | head -10

# 3. Очистить старые журналы
sudo journalctl --vacuum-time=3days

# 4. Сжать несжатые старые журналы
find /var/log -name "*.log.*" ! -name "*.gz" -exec gzip {} \;

# 5. Принудительно запустить logrotate
sudo logrotate --force /etc/logrotate.conf

# 6. Очистить кэш пакетов
sudo apt clean  # Ubuntu/Debian
sudo dnf clean all  # RHEL/CentOS

Автоматизируйте управление журналами: регулярно проверяйте конфигурацию logrotate, устанавливайте ограничения размера journald и настраивайте оповещения для мониторинга использования диска.

Заключение

Эффективное управление журналами предотвращает проблемы с заполнением диска и повышает надёжность системы. С автоматической ротацией logrotate, ограничениями размера journald и регулярным анализом журналов вы можете поддерживать серверы REXE в хорошем состоянии.