rsyslog: ошибка файла состояния при чтении журнала
Модуль чтения журнала помнит позицию в файле состояния. При его потере приёмник либо читает журнал с начала, дублируя записи, либо пропускает часть. Это тихая потеря данных: сама служба продолжает работать.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Файл состояния повреждён или удалён
При потере позиции модуль начинает чтение заново или с конца, в зависимости от настроек.
-
Нет прав на каталог состояния
Служба работает от своего пользователя. Без права записи позиция не сохраняется, и после перезапуска чтение начинается заново.
-
Записи дублируются после каждого перезапуска
Чтение с начала при потере позиции даёт полный дубль журнала в текстовых файлах.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщения приёмника о чтении журнала.
journalctl -u rsyslog -n 30 --no-pagerФайл состояния и его владелец.
sudo ls -l /var/lib/rsyslog/Каталог состояния и пользователь службы.
systemctl show rsyslog -p StateDirectory -p UserРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При потере позиции модуль начинает чтение заново или с конца, в зависимости от настроек.
- Как проверить
-
Посмотрите файл состояния и сообщения службы.
sudo ls -l /var/lib/rsyslog/ 2>/dev/null journalctl -u rsyslog -n 20 --no-pager | grep -iE "imjournal|state"
- Как исправить
- Восстановите каталог состояния с верным владельцем и перезапустите приёмник. Каталог должен быть на постоянном разделе.
- Почему происходит
- Служба работает от своего пользователя. Без права записи позиция не сохраняется, и после перезапуска чтение начинается заново.
- Как проверить
-
Посмотрите права и пользователя службы.
sudo ls -ld /var/lib/rsyslog 2>/dev/null systemctl show rsyslog -p User -p StateDirectory
- Как исправить
-
Объявите каталог состояния через
StateDirectory=: systemd выставит владельца при каждом запуске.
- Почему происходит
- Чтение с начала при потере позиции даёт полный дубль журнала в текстовых файлах.
- Как проверить
-
Посмотрите размер файлов приёмника и время перезапусков.
sudo ls -l /var/log/syslog 2>/dev/null systemctl show rsyslog -p ExecMainStartTimestamp -p NRestarts
- Как исправить
- Наладьте сохранение позиции. Если приёмник нужен только для внешней отправки, дублирование означает двойной расход канала.
Пример вывода
Нет прав на каталог состояния. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
rsyslogd[10700]: imjournal: open() failed for path: '/var/lib/rsyslog/imjournal.state': Permission denied [v8.2312.0]
rsyslogd[10700]: imjournal: journal reloaded, reading from the beginning [v8.2312.0]
Связанные ошибки
- Записи дублируются: журнал и syslog пишут одно и то же Каждая строка в журнале и в файлах syslog: пересылка включена дважды, объём растёт вдвое.
- status=238/STATE_DIRECTORY в systemd Код 238/STATE_DIRECTORY: не удалось подготовить постоянный каталог службы в /var/lib из StateDirectory=.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- File corrupted or uncleanly shut down, renaming and replacing Журнал повреждён после жёсткой перезагрузки: что означает сообщение и когда нужно вмешательство.
- Suppressed N messages from unit: часть записей потеряна journald отбросил часть записей из-за ограничения частоты. Как понять, что именно потеряно, и когда предел нужно поднять.
- journalctl -b -1: Failed to look up boot, no such boot ID Запрос журнала прошлой загрузки не находит её: журнал непостоянный или обрезан.
- logrotate: ошибка в действии после ротации Ротация журналов проходит, а служба не переоткрывает файлы: сбой действия после ротации.
- status=209/STDOUT в systemd Код 209/STDOUT: systemd не смог настроить стандартный вывод службы. Чаще всего виноват путь в StandardOutput=append: или file:.
Где встречается чаще всего
Источники
- Документация rsyslog: модуль чтения журнала
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено каталогом состояния без права записи.