logrotate: ошибка в действии после ротации
После ротации logrotate выполняет действие, которое должно заставить службу переоткрыть файлы журнала. Если оно падает, ротация формально прошла: старый файл переименован, а служба продолжает писать в него — и новые записи исчезают из виду.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Действие вызывает несуществующую команду или unit
Типичный случай: описание ротации перенесено с другой машины, где служба называлась иначе.
-
Служба не умеет переоткрывать файлы
Действие выполняется, но программа не реагирует. Она продолжает писать в переименованный файл.
-
Права не позволяют выполнить действие
Ротация выполняется от root, но действие может обращаться к тому, к чему доступа нет — например к сокету службы.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Прогон без изменений: показывает, что и как будет выполнено.
sudo logrotate -d /etc/logrotate.d/myappВ какой файл пишет служба прямо сейчас.
PID=$(systemctl show -p MainPID --value myapp.service); sudo ls -l /proc/$PID/fd | grep logРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Типичный случай: описание ротации перенесено с другой машины, где служба называлась иначе.
- Как проверить
-
Посмотрите описание и выполните прогон.
sudo cat /etc/logrotate.d/myapp sudo logrotate -d /etc/logrotate.d/myapp 2>&1 | tail -20
- Как исправить
-
Исправьте действие: для служб под systemd обычно достаточно перезагрузки настроек через
systemctl reload.
- Почему происходит
- Действие выполняется, но программа не реагирует. Она продолжает писать в переименованный файл.
- Как проверить
-
Посмотрите, куда пишет служба после ротации.
PID=$(systemctl show -p MainPID --value myapp.service); sudo ls -l /proc/$PID/fd 2>/dev/null | grep -i log
- Как исправить
- Либо используйте параметр копирования с усечением вместо переименования, либо переведите вывод в журнал systemd: тогда ротация не нужна вовсе.
- Почему происходит
- Ротация выполняется от root, но действие может обращаться к тому, к чему доступа нет — например к сокету службы.
- Как проверить
-
Посмотрите вывод прогона.
sudo logrotate -v /etc/logrotate.d/myapp 2>&1 | tail -20
- Как исправить
- Исправьте действие так, чтобы оно работало от root: обращение к службе делается через systemctl.
Пример вывода
Действие после ротации не выполнилось. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
logrotate[4200]: error: error running shared postrotate script for /var/log/myapp/*.log
logrotate[4200]: Failed to reload myapp.service: Unit myapp.service not found.
systemd[1]: logrotate.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- status=240/LOGS_DIRECTORY в systemd Код 240/LOGS_DIRECTORY: не удалось подготовить каталог журналов службы в /var/log из LogsDirectory=.
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
- Журнал пропадает после перезагрузки journalctl не показывает записи прошлых загрузок: журнал хранится только в памяти. Как включить постоянное хранение.
- rsyslog: ошибка файла состояния при чтении журнала Приёмник журналов теряет записи или читает их заново: файл состояния повреждён или недоступен.
- status=209/STDOUT в systemd Код 209/STDOUT: systemd не смог настроить стандартный вывод службы. Чаще всего виноват путь в StandardOutput=append: или file:.
- status=222/STDERR в systemd Код 222/STDERR: не удалось настроить поток ошибок службы. Разбор причин и отличие от кода 209.
- Журналы контейнеров заполнили диск Место кончилось из-за журналов контейнеров: ограничение размера не задано, ротации нет.
- Записи дублируются: журнал и syslog пишут одно и то же Каждая строка в журнале и в файлах syslog: пересылка включена дважды, объём растёт вдвое.
Источники
-
logrotate(8)
Действия после ротации и параметры копирования. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено действием с неверным именем службы.