Вопрос или проблема
Я настроил свой systemd-journald-remote.service
, и (1) тестовый клиент успешно подключается через systemd-journald-upload.service
. Когда я обычно просматриваю журналы journald
, я использую journalctl -fxb
. Я пробовал то же самое с удалённым файлом journald, используя:
sudo journalctl -fxb --file=/var/log/journal/remote/remote-192.168.122.22.journal
и это также работает.
Вот в чём проблема: пока удалённая система работает, всё идёт как задумано. Однако, когда удалённая система перезагружается, журналы удалённого сервера по-прежнему пересылаются, но текущий вывод перестаёт обновляться. Перезапуск команды tail помогает, но я хотел бы избежать этого, особенно когда хочу добавить более 30 систем.
Что я делаю не так?
Что я делаю не так
Вы указываете опцию -b
, которая явно требует от journalctl ограничить фильтр “текущей загрузкой”, которая определяется по UUID “boot ID”, включенному в каждое сообщение.
Boot ID генерируется ядром и доступен через /proc/sys/kernel/random/boot_id
, который будет прочитан journald удалённой системы при старте и прикреплён к каждому сообщению как _BOOT_ID
, который вы можете увидеть в выводе journalctl -o verbose
.
Когда вы указываете -b
вместе с файлом журнала, ваш journalctl сканирует файл журнала, чтобы найти самое последнее сообщение, берет поле _BOOT_ID из него и настраивает фильтр для получения только сообщений, соответствующих данной загрузке. Например:
$ SYSTEMD_LOG_LEVEL=debug journalctl -f -b --file=$PWD/system.journal
Файл /var/log/journal/asdf/system.journal добавлен.
Найден boot ID 9881c6da57d24994a0989fba0a10fd4a по смещению 0
Найдена загрузка 9881c6da57d24994a0989fba0a10fd4a за +0
Фильтр журнала: _BOOT_ID=9881c6da57d24994a0989fba0a10fd4a
После перезагрузки удалённой системы её сообщения будут иметь другой _BOOT_ID
, и, конечно, они больше не будут соответствовать фильтру. Чтобы избежать этого, не используйте опцию -b
.
(Использование -b
вместе с -f
в любом случае имеет мало смысла, так как каждая загрузка генерирует сотни сообщений во время старта, и поэтому начальные 10 строк “tail” сообщений будут автоматически из текущей загрузки в любом случае.)
Ответ или решение
Для отслеживания журналов удаленной системы с помощью systemd journal, важно учитывать настройки, которые вы используете с командой journalctl
. Вы уже успешно настроили systemd-journald-remote.service
и используете службу systemd-journald-upload.service
для подключения клиента. Однако при использовании параметра -b
(что означает «текущая загрузка»), вы сталкиваетесь с проблемой, когда после перезагрузки удаленной системы журнал перестает обновляться.
Причины проблемы
Проблема заключается в том, что при указании флага -b
journalctl
будет фильтровать журналы только по текущему идентификатору загрузки (BOOT_ID), который генерируется ядром и записывается в каждое сообщение лога. После перезагрузки удаленной системы BOOT_ID меняется, и, следовательно, журнал больше не соответствует фильтру, установленному с помощью параметра -b
.
Решение
Чтобы избежать необходимости перезапуска команды journalctl
после перезагрузки удаленной системы, просто уберите флаг -b
из вашей команды. Вместо этого используйте только -f
, чтобы продолжать отслеживать новые записи.
Используйте следующую команду для отслеживания журнала удаленной системы:
sudo journalctl -f --file=/var/log/journal/remote/remote-192.168.122.22.journal
С этой настройкой команда будет продолжать показывать новые записи журнала, даже если удаленная система перезагрузится, так как она будет отслеживать все сообщения в файле журнала, независимо от идентификатора загрузки.
Рекомендации
- Мониторинг нескольких систем: Если у вас есть 30+ систем, применяйте аналогичный подход для каждой системы, меняя имя файла для каждой удаленной машины.
- Автоматизация: Рассмотрите возможность написания скрипта, который будет автоматически подключаться к каждому удаленному журналу, чтобы упростить процесс мониторинга.
- Периодическая проверка: Настройте уведомления или периодическую проверку состояния удаленных систем, чтобы минимизировать время простоя в мониторинге.
Таким образом, корректируя вашу команду и убирая параметр -b
, вы сможете эффективно отслеживать журналы удаленной системы без необходимости ручного перезапуска команды после перезагрузок.