Настройка лимитов журнала systemd: оптимизация использования диска и ротация логов
Настройте размер журнала systemd и ограничения по времени хранения с помощью `journald.conf`, `journalctl` и безопасных команд очистки логов.
Настройка лимитов журнала systemd: оптимизация использования диска и ротация логов
Системные логи полезны, пока они незаметно не заполнят диск. На Linux-системах, использующих systemd, systemd-journald хранит индексированные логи и может принудительно устанавливать ограничения по размеру и возрасту, чтобы ваш журнал сохранял достаточно истории, не вытесняя остальную часть системы.
Это руководство показывает, где настраивать лимиты журнала systemd, чем различаются постоянное и временное хранилище, а также как проверять очистку с помощью journalctl.
Понимание режимов хранения журнала
Прежде чем устанавливать лимиты, важно понимать, где журнал хранит свои логи. systemd-journald поддерживает два основных режима хранения, определяемых директивой Storage= в journald.conf.
1. Временное хранилище (/run/log/journal)
Временное хранилище хранит логи во временной файловой системе, обычно tmpfs или каталоге, поддерживаемом памятью. Логи, хранящиеся здесь, теряются при перезагрузке системы.
- Сценарий использования: Сильно временные логи, среды с ограниченными ресурсами, где не требуется постоянная история.
- Конфигурация: Установите
Storage=volatile.
2. Постоянное хранилище (/var/log/journal)
Постоянное хранилище гарантирует, что логи сохраняются после перезагрузок системы, что делает его стандартным выбором для серверов и производственных систем. Каталог /var/log/journal создается, если он еще не существует.
- Сценарий использования: Производственные системы, требующие аудиторских следов и исторического анализа.
- Конфигурация: Установите
Storage=persistentилиStorage=auto(по умолчанию, которое активирует постоянное хранилище, если существует/var/log/journal).
Совет: Если система настроена на
Storage=auto, а/var/log/journalне существует, логи по умолчанию будут храниться во временном хранилище, пока не будет создан постоянный каталог.
Основной конфигурационный файл
Все основные лимиты и поведение systemd-journald управляются через основной конфигурационный файл, обычно расположенный по адресу /etc/systemd/journald.conf.
# Редактирование основного конфигурационного файла
sudo nano /etc/systemd/journald.conf
Чтобы будущие обновления пакетов не перезаписали ваши настройки, рекомендуется создать файл переопределения в каталоге /etc/systemd/journald.conf.d/. Например, создайте /etc/systemd/journald.conf.d/01-custom-limits.conf.
Реализация ограничений по размеру для оптимизации диска
Наиболее распространенный метод контроля роста журнала — установка максимальных лимитов использования диска. Когда указанный размер превышен, journald автоматически начинает удалять самые старые архивированные логи, пока лимит не будет достигнут.
SystemMaxUse (Абсолютный постоянный лимит)
Эта директива определяет максимальное общее дисковое пространство, которое могут занимать постоянные файлы журнала (/var/log/journal). Это основной механизм контроля использования постоянного диска.
Файлы журнала будут ротироваться и очищаться, если общий размер превышает это значение. Обычные единицы измерения включают K (килобайты), M (мегабайты), G (гигабайты) и T (терабайты).
| Директива | Описание | Пример значения |
|---|---|---|
SystemMaxUse |
Максимальный размер для постоянных данных журнала. | 500M или 2G |
Пример конфигурации:
Чтобы ограничить постоянное хранилище журнала максимум 1 Гигабайтом:
[Journal]
SystemMaxUse=1G
SystemKeepFree (Буфер безопасности диска)
В то время как SystemMaxUse устанавливает верхнюю границу, SystemKeepFree действует как важная мера безопасности. Он указывает минимальный объем дискового пространства, который должен оставаться свободным в файловой системе, содержащей файлы журнала.
Если доступное свободное пространство падает ниже значения SystemKeepFree, journald очистит логи, даже если лимит SystemMaxUse еще не достигнут. Это предотвращает полное заполнение диска ростом логов и остановку критических системных операций.
| Директива | Описание | Пример значения |
|---|---|---|
SystemKeepFree |
Минимальное свободное пространство, необходимое в файловой системе журнала. | 10% или 4G |
Лучшая практика: Настоятельно рекомендуется устанавливать как SystemMaxUse, так и SystemKeepFree. Используйте процент (%) для SystemKeepFree на больших дисках для лучшей масштабируемости.
RuntimeMaxUse (Лимит временного хранилища)
Если вы используете временное хранилище (/run/log/journal) или хотите контролировать использование памяти/tmpfs даже при включенном постоянном хранилище, используйте RuntimeMaxUse. Это контролирует дисковое пространство, используемое временными файлами журнала, которые являются временными и находятся в памяти или tmpfs.
| Директива | Описание | Пример значения |
|---|---|---|
RuntimeMaxUse |
Максимальный размер для временных данных журнала. | 300M |
Реализация временных ограничений для хранения логов
Лимиты на основе размера гарантируют поддержание дискового пространства, но не гарантируют возраст логов. Если объем логов низкий, логи могут храниться бесконечно. Лимиты на основе времени гарантируют, что логи будут удалены после определенного периода, независимо от общего размера.
MaxRetentionSec
Эта директива определяет максимальное время хранения логов. Любые логи старше этого срока будут автоматически удалены, дополняя лимиты по размеру.
| Директива | Описание | Пример значения |
|---|---|---|
MaxRetentionSec |
Максимальный возраст хранимых логов. | 30 days, 1 month, 2 weeks |
Пример конфигурации:
Чтобы гарантировать, что логи никогда не будут старше 30 дней, а общее постоянное хранилище никогда не превысит 5 Гигабайт:
[Journal]
Storage=persistent
SystemMaxUse=5G
SystemKeepFree=10%
MaxRetentionSec=30 days
Примечание: Если
MaxRetentionSecустановлен на 30 дней, аSystemMaxUseна 5G, journald будет соблюдать лимит, который будет достигнут первым. Если лимит в 5G будет достигнут за 10 дней, логи старше 10 дней будут удалены, переопределяя политику хранения в 30 дней.
Практические шаги: применение и проверка конфигурации
1. Проверка текущего использования журнала
Перед внесением изменений проверьте текущее использование диска журналом:
journalctl --disk-usage
Пример вывода:
Journals take up 3.4G of disk space.
2. Настройка лимитов
Отредактируйте /etc/systemd/journald.conf (или ваш файл переопределения) и раскомментируйте/установите нужные директивы. Например, чтобы обеспечить максимальное использование 500 МБ и хранение в течение 30 дней:
[Journal]
Storage=persistent
SystemMaxUse=500M
SystemKeepFree=1G
MaxRetentionSec=30 days
3. Перезапуск службы журнала
Чтобы изменения вступили в силу, необходимо перезапустить службу systemd-journald. Это не влияет на активное ведение логов, но сообщает демону о необходимости немедленно применить новые ограничения по размеру и начать процесс очистки.
sudo systemctl restart systemd-journald
4. Принудительная ручная очистка
Если необходимо немедленно освободить дисковое пространство в соответствии с новыми лимитами, перезапуска службы часто достаточно. В качестве альтернативы вы можете явно очистить файлы с помощью journalctl.
Чтобы очистить логи для освобождения места, оставив только последние 500 МБ:
sudo journalctl --vacuum-size=500M
Чтобы очистить логи старше 7 дней:
sudo journalctl --vacuum-time=7d
Сводка ключевых директив
| Директива | Область действия | Назначение |
|---|---|---|
Storage |
Глобальная | Определяет место хранения (persistent, volatile, auto). |
SystemMaxUse |
Постоянное (/var/log/journal) |
Абсолютный максимальный общий размер для постоянных логов. |
SystemKeepFree |
Постоянное (/var/log/journal) |
Обеспечивает минимальный объем свободного дискового пространства. |
RuntimeMaxUse |
Временное (/run/log/journal) |
Абсолютный максимальный общий размер для временных (runtime) логов. |
MaxRetentionSec |
Оба | Определяет максимальный возраст хранимых логов. |
Вывод
Устанавливайте лимиты журнала до того, как логи станут причиной сбоя. Для большинства серверов используйте drop-in в /etc/systemd/journald.conf.d/, установите SystemMaxUse плюс SystemKeepFree, добавьте MaxRetentionSec, если у вас есть цель по хранению, перезапустите systemd-journald и подтвердите результат с помощью journalctl --disk-usage.