имя юнита в journalctl пустое при фильтрации с использованием флага -u для flatpaks

Вопрос или проблема

journalctl показывает логи в следующем формате

<ДАТА> <ВРЕМЯ> <ИМЯ ХОСТА> <ИМЯ ЕДИНИЦЫ> <СООБЩЕНИЕ>

Когда мне нужно было получить логи от одной единицы, я добавлял флаг -u
journalctl -u <ИМЯ ЕДИНИЦЫ>. Это работает в большинстве случаев, но не для Flatpak. Важно отметить, что “решение” с grep или awk не принимается, так как оно отправляет все логирование от всех единиц в простой текстовый фильтр. Это требует от пользователя создания более сложного фильтра, чтобы другие логи от других приложений не были извлечены. Будет полезно объяснить, почему отображаемые имена в логах не всегда можно использовать с флагом -u.

Пример:

> journalctl -b -1 -xe
...
Dec 29 18:05:51 hostname io.github.mrvladus.List.desktop[2999]: [DEBUG] Notifications: Check
Dec 29 18:05:51 hostname io.github.mrvladus.List.desktop[2999]: [DEBUG] Notifications: Check
Dec 29 18:05:51 hostname io.github.mrvladus.List.desktop[2999]: [DEBUG] Notifications: Check
Dec 29 18:05:51 hostname io.github.mrvladus.List.desktop[2999]: [DEBUG] Notifications: Check
...
> journalctl -b -1 -u io.github.mrvladus.List.desktop[2999]
Failed to add filter for units: No data available
> journalctl -b -1 -u io.github.mrvladus.List.desktop
-- No entries --
> journalctl -b -1 -u List.desktop
-- No entries --
> journalctl -b -1 -u flatpak-app-io.github.mrvladus.List.desktop
-- No entries --
> journalctl -b -1 -u flatpak-app-io.github.mrvladus.List.scope
-- No entries --

из https://unix.stackexchange.com/a/170396/416910 я узнал, что

systemctl list-unit-files --all

перечислит все единицы, которые могут генерировать логи. В этом выводе нет ничего похожего на io.github.mrvladus.List в моем случае. Как она может генерировать логи, если её нет в этом списке?

Этот вопрос похож на Почему journalctl не отображает сообщения лога, если я использую фильтрацию по единице?, но автор утверждает, что это была ошибка, которая была исправлена в версии 236. Он так и не уточнил, решил ли обновление его проблему.

> journalctl --version
systemd 257 (257.1-1-arch)
+PAM +AUDIT -SELINUX -APPARMOR -IMA +IPE +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK +BTF +XKBCOMMON +UTMP -SYSVINIT +LIBARCHIVE

Ответ или решение

Для устранения проблемы с фильтрацией логов Flatpak приложений в journalctl с использованием флага -u, важно понять, почему текущий подход не работает.

Почему -u не отображает логи Flatpak приложений

Архитектура и специфика Flatpak

Flatpak приложения запускаются в изолированных контейнерах, что позволяет обеспечивать безопасность и управляемость приложений. Эти приложения не являются полноценными системными юнитами, а их процессы могут быть запущены под другим пользователем и/или с использованием других механизмов, чем у традиционных системных служб, управляемых systemd.

Юниты в systemd

Когда вы используете флаг -u в journalctl, вы фильтруете логи по определенному системному юниту systemd. Однако Flatpak приложения не всегда имеют соответствие в виде systemd юнитов, поэтому попытки фильтрации с использованием известных стратегий на уровне юнитов не дают результата.

Почему отображаемые имена логов не всегда фильтруются

  1. Иерархия имён: Имена Flatpak приложений, такие как io.github.mrvladus.List.desktop, часто логируются не как юнит, а как идентификатор процесса или логический объект, управляемый другим механизмом.

  2. Отсутствие регистрации в systemd: Flatpak процессы могут не регистрироваться как отдельные юниты в системе systemd, что объясняется отсутствием их в списке выведенном командой systemctl list-unit-files --all.

Как получить нужные логи без grep или awk

Если использовать стандартные методы, такие как grep или awk, неприемлемо, вам следует обратить внимание на следующие подходы:

  1. Использование flatpak ps: Этой командой можно определить запущенные Flatpak приложения и их процессы.

  2. Прямое обращение к логам приложения: Если возможно, обратитесь к логам во внутренних каталогах приложения, поскольку многие Flatpak пакеты ведут собственные логи.

  3. Анализ пространства имён процессов: Определите простор использования системных ресурсов и выполните таргетирование процессов, запущенных через Flatpak.

  4. Использование утилит мониторинга, поддерживающих Flatpak: Некоторые утилиты и интеграции системы могут лучше справляться с такой спецификой за счёт дополнительных плагинов или модулей, специально разработанных для работы с контейнерами.

Подведение итога

Несмотря на то, что journalctl не позволяет напрямую отфильтровать логи для Flatpak приложений из-за особенностей их реализации и управления процессами, есть альтернативные подходы для мониторинга и захвата логов. Разработка подходов для работы с journalctl непосредственно через доработки может быть ограниченной, поэтому важно воспользоваться интеграциями и утилитами, более ориентированными на работу с контейнерами и Flatpak окружениями.

Для профессионалов ИТ важно рассматривать системные логи через призму экосистемы приложения, а не только системных процессов, особенно в случае распространённых технологий контейнеризации.

Оцените материал
Добавить комментарий

Капча загружается...