Вопрос или проблема
Пример на Python здесь позволяет мне записывать в журнал systemd, просто добавив logger.info(“Привет, мама”). Я хочу записывать в другой пространство журналов с пользовательским/долгим периодом хранения данных, как объяснено здесь в разделе 4.1. Я создал пространство журналов под названием pulldicom на основе этой второй ссылки.
Я не знаю, как указать использование другого пространства имен с помощью JournalHandler из Python. Я пытался указать пространство имен таким образом:
# Создать журнал логгера
# Для не-стандартного пространства имен, позволяющего настроить долговременное хранение логов. НЕ РАБОТАЕТ
journalHandler = JournalHandler(NAMESPACE='pulldicom', SYSLOG_IDENTIFIER='logging-systemd-python-app')
# Для стандартного пространства имен РАБОТАЕТ
#journalHandler = JournalHandler(SYSLOG_IDENTIFIER='logging-systemd-python-app')
Обратите внимание, что я не пытаюсь сделать это из сервиса systemd, для которого существует документация. Я также не уверен, как протестировать, что мое пространство журналов работает само по себе. Создать фейковый сервис?
У этого нет такой функциональности, и, по-видимому, также нет в библиотеке libsystemd (sd-journal).
Пространства имен не различаются по полю сообщения — это полностью изолированные экземпляры journald, каждый со своими сокетами, и библиотеке нужно знать, что ей нужно подключаться к нестандартному пути сокета перед отправкой любых сообщений.
На данный момент в libsystemd есть только одна функция, которая поддерживает это — существует вариант функции _stream_fd() с учетом пространства имен, sd_journal_stream_fd_with_namespace()
, который используется для подключения стандартного вывода сервиса к журналу. Теоретически можно написать обработчик логирования на основе этого (и сделать это было бы проще, повторно реализовав протокол, а не используя привязки библиотеки), но пока ни systemd-python, ни pystemd этого не предлагают.
Тем не менее, все они сохраняют совместимость с syslog, так что если вам не нужны пользовательские поля (помимо идентификатора syslog, который все еще можно настроить), вы можете вместо этого использовать:
SysLogHandler(address="/run/systemd/journal.pulldicom/dev-log")
Ответ или решение
Как использовать модуль python systemd.journal для логирования в новую созданную систему журналов systemd
Для логирования в отдельное пространство журналов systemd (journal namespace) необходимо понимать, как работает взаимодействие Python с библиотекой libsystemd
. В этом ответе мы подробно рассмотрим, как корректно настроить логирование в созданное пространство журналов, чтобы использовать кастомизированные параметры хранения данных.
Шаги для создания нового пространства журналов
-
Создание пространства журналов:
Сначала вы должны создать пространство журналов в системе, что можно сделать с помощью командной строки. Например:sudo journalctl --namespace=pulldicom --flip
-
Проверка существования пространства журналов:
Убедитесь, что пространство создано и работает. Это можно сделать, запустив:sudo journalctl --namespace=pulldicom
-
Установка необходимых библиотек:
Убедитесь, что на вашем компьютере установлены необходимые библиотеки для работы с systemd:sudo apt install python3-systemd
Использование SysLogHandler
для логирования
Как упомянуто в предоставленной информации, стандартная библиотека systemd
для Python не поддерживает логи с пространствами журналов. Однако существует решение с использованием SysLogHandler
.
Код для логирования в пространство журналов
Ниже представлен пример настройки вашего логирования:
import logging
from logging.handlers import SysLogHandler
# Настройка обработки логов
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)
# Используем SysLogHandler с указанием адреса для нашего пространства
namespace = "pulldicom"
syslog_address = f"/run/systemd/journal.{namespace}/dev-log"
journal_handler = SysLogHandler(address=syslog_address)
# Форматирование логируемых сообщений
formatter = logging.Formatter('%(asctime)s %(name)s: %(message)s')
journal_handler.setFormatter(formatter)
# Добавление обработчика к логгеру
logger.addHandler(journal_handler)
# Пример записи лога
logger.info("Привет, мир! Это сообщение в пространстве журналов 'pulldicom'.")
Как тестировать новое пространство журналов
Для тестирования вашего пространства журналов нет необходимости создавать фейковую службу. Вы можете просто использовать journalctl
для просмотра записей. Выполните команду:
sudo journalctl --namespace=pulldicom
Это должно отобразить ваши записанные сообщения. Убедитесь, что ваши сообщения отображаются корректно, и обратите внимание на параметры хранения, которые вы установили для вашего пространства.
Заключение
Несмотря на отсутствие прямой поддержки пространств журналов в библиотеке systemd
для Python, использование SysLogHandler
с указанием специального адреса позволяет эффективно направлять логи в созданное пространство. Такой подход обеспечит вам контроль над параметрами хранения и мониторингом логов.