Что означает ошибка logrotate
Ошибка logrotate — это сбой в работе стандартной утилиты Linux для ротации (архивации и очистки) лог-файлов. Она обычно проявляется одним из следующих способов:
- Логи не ротируются по расписанию (например, ежедневно или еженедельно).
- В системном журнале (
/var/log/syslogили/var/log/messages) появляются записи вида:error: error opening /var/log/nginx/access.log: Permission denied error: logrotate failed to rotate /var/log/syslog: No such file or directory - Ротация происходит, но создаётся некорректный архив (пустой или с нулевым размером).
- Утилита
logrotateзавершается с ненулевым кодом возврата при ручном запуске.
Ошибка не критична для работы системы, но может привести к переполнению диска или потере исторических данных логов.
Причины возникновения
- Недостаточные права доступа. Процесс
logrotate(запускаемый отrootчерезcron) не может прочитать исходный лог-файл или записать сжатый архив из-за неверных прав (chmod) или владельца (chown) файла/каталога. - Ошибки в конфигурации. Синтаксическая ошибка в файле
/etc/logrotate.confили в одном из файлов в/etc/logrotate.d/. Например, пропущена закрывающая фигурная скобка}или указан несуществующий путь. - Конфликт с другим процессом. Другой демон (например,
syslog-ngилиrsyslog) удерживает дескриптор лог-файла в момент попытки его ротации, что вызывает ошибку переименования. - Отсутствие лог-файла. В конфигурации указан путь к логу, который был удалён или никогда не создавался, а опция
missingokне указана. - Проблемы с
cron. Задание для регулярного запускаlogrotateотсутствует или не работает (например, из-за проблем в/etc/crontabили файлах в/etc/cron.*).
Способ 1: Диагностика через тестовый запуск
Это основной и самый информативный способ. Он покажет, что планировалось сделать, без реальных изменений.
- Выполните команду тестового прогона:
Флагsudo logrotate -d /etc/logrotate.conf-dвключает режим отладки. - Внимательно изучите вывод. Ищите строки со словами
error,ignoringилиreading. Они укажут на конкретный файл конфигурации и причину. - Пример проблемного вывода:
Здесь ясно видно, что проблема с правами на файлreading config file /etc/logrotate.d/nginx reading config file /etc/logrotate.d/nginx error: error opening /var/log/nginx/access.log: Permission denied ignoring /var/log/nginx/access.log because of error/var/log/nginx/access.log.
Способ 2: Проверка и исправление прав доступа
Если диагностика указала на Permission denied:
- Проверьте владельца и права на проблемный лог-файл и его родительский каталог:
Обычно лог-файлы должны принадлежать пользователю, который их пишет (например,ls -l /var/log/nginx/www-dataдля nginx), а группеadmилиsyslog, чтобыroot(от которого работаетlogrotate) имел доступ. - Исправьте права, если нужно. Например, для лога nginx:
Важно: Не меняйте права на файлы, которые активно пишутся сервисами, без понимания последствий. Лучше всего, если группаsudo chown www-data:adm /var/log/nginx/access.log sudo chmod 640 /var/log/nginx/access.logadm(илиsyslog) имеет на них права на чтение. - Проверьте права на каталог
/var/log/nginx/.logrotateдолжен иметь право на запись в него для создания архивов:sudo chmod 755 /var/log/nginx/
Способ 3: Проверка конфигурационных файлов
Если тестовый запуск не выявил ошибок Permission denied, но ротация не происходит:
- Проверьте синтаксис основного файла конфигурации:
Или просто запустите тестовый прогон и найдитеsudo logrotate -d /etc/logrotate.conf 2>&1 | grep -i "error\|syntax"error. - Проверьте файлы в
/etc/logrotate.d/. Убедитесь, что:- Каждый блок правил (для одного сервиса) заканчивается пустой строкой. Это обязательное требование синтаксиса.
- Пути к лог-файлам указаны корректно и существуют.
- Используются правильные директивы (
daily,rotate 7,compressи т.д.).
- Пример корректного файла в
/etc/logrotate.d/nginx:
Обратите внимание на пустую строку после/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 640 www-data adm sharedscripts postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript }}.
Способ 4: Устранение конфликта с процессом
Если лог-файл используется другим процессом (часто rsyslog), его ротация может завершиться ошибкой device or resource busy. Решения:
- Используйте опцию
copytruncate. В конфигурации для проблемного лога добавьте эту директиву. Она копирует файл и сразу обнуляет исходный, не требуя перезапуска сервиса. Минус — возможна потеря записей, сделанных во время копирования./var/log/ваш_лог.log { ... copytruncate } - Используйте скрипт
postrotate. Это предпочтительный способ. В скрипте после ротации отправляйте сигнал демону логгера, чтобы он переоткрыл файл. Пример дляrsyslog(как в конфиге nginx выше) илиsystemd-journald:postrotate journalctl --rotate endscript
Способ 5: Принудительный запуск и проверка cron
Если конфигурация верна, но ротация по расписанию не происходит:
- Запустите вручную с принудительной ротацией:
Флагsudo logrotate -vf /etc/logrotate.conf-v(verbose) покажет все действия. Флаг-f(force) игнорирует условие "ещё не прошло время для ротации". - Проверьте, что
cronзапускаетlogrotate:- Задание обычно находится в
/etc/cron.daily/logrotate(симлинк на/usr/sbin/logrotate). - Убедитесь, что файл исполняем:
ls -l /etc/cron.daily/logrotate. - Проверьте, работают ли другие задания
cron.daily. Можно посмотреть время последнего изменения файлов в/var/log/— они должны обновляться ежедневно.
- Задание обычно находится в
Профилактика
Чтобы избежать проблем с logrotate в будущем:
- Всегда используйте тестовый запуск (
logrotate -d) после внесения изменений в конфигурацию. - Соблюдайте синтаксис: пустая строка после каждого блока в
/etc/logrotate.d/. - Правильно настраивайте права. Убедитесь, что группа
adm(илиsyslog) имеет доступ на чтение ко всем лог-файлам, которые ротируются. - Для сервисов, пишущих в собственные файлы, в конфиге
logrotateиспользуйтеcopytruncateили корректныйpostrotate-скрипт с отправкой сигнала (например,kill -USR1). - Регулярно мониторьте место на диске (
df -h) и размер логов (du -sh /var/log/*), чтобы убедиться, что ротация происходит эффективно.