Как использовать модуль python systemd.journal для ведения журнала в новом созданном пространстве имен journald системы systemd.

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

Пример на 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. В этом ответе мы подробно рассмотрим, как корректно настроить логирование в созданное пространство журналов, чтобы использовать кастомизированные параметры хранения данных.

Шаги для создания нового пространства журналов

  1. Создание пространства журналов:
    Сначала вы должны создать пространство журналов в системе, что можно сделать с помощью командной строки. Например:

    sudo journalctl --namespace=pulldicom --flip
  2. Проверка существования пространства журналов:
    Убедитесь, что пространство создано и работает. Это можно сделать, запустив:

    sudo journalctl --namespace=pulldicom
  3. Установка необходимых библиотек:
    Убедитесь, что на вашем компьютере установлены необходимые библиотеки для работы с 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 с указанием специального адреса позволяет эффективно направлять логи в созданное пространство. Такой подход обеспечит вам контроль над параметрами хранения и мониторингом логов.

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

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