Укажите источник журнала (лог) сервиса systemd

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

Я использую unattended-upgrades на Debian 12 для автоматического обновления системы.

Моя проблема в том, что этот пакет не записывает логи в stdout, а в файл /var/logs/unattended-upgrades/. Это неудобно для меня.

Могу ли я указать источник ввода для логов в системных единицах, чтобы я мог просматривать их с помощью journalctl?

Journalctl не поддерживает импорт файлов. Вам понадобится отдельная служба, которая будет выполнять tail -F на файле журнала (и записывать свой stdout в журнал).

[Service]
Type=exec
ExecStart=stdbuf -o0 tail -F /var/log/whatever.log
SyslogIdentifier=upgrades

Вам нужно будет использовать либо journalctl -t upgrades (по идентификатору syslog), либо journalctl -u the-forwarder – а не journalctl -u unattended-upgrades – для просмотра таких логов. Существует возможность добавить свойство OBJECT_UNIT= к сообщениям, чтобы они отображались в journalctl -u unattended-upgrades несмотря на то, что они записываются другой единицей; но не через logging stdout – возможно, через systemd-cat, но скорее всего только через пользовательский обертку.

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

Для того чтобы перенаправить логи пакета unattended-upgrades в систему логирования systemd и иметь возможность просматривать их с помощью journalctl, действительно, вам потребуется создать отдельный сервис, который будет следить за файлами логов с помощью команды tail -F.

Вот как вы можете это сделать:

  1. Создайте новый unit-файл для системы systemd. Вы можете назвать его, например, unattended-upgrades-tailer.service. Откройте терминал и выполните команду:

    sudo nano /etc/systemd/system/unattended-upgrades-tailer.service
  2. Добавьте следующее содержимое в созданный файл:

    [Unit]
    Description=Tail logs from unattended-upgrades
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/stdbuf -o0 /usr/bin/tail -F /var/log/unattended-upgrades/unattended-upgrades.log
    SyslogIdentifier=upgrades
    StandardOutput=journal
    
    [Install]
    WantedBy=multi-user.target

    Объяснение:

    • Type=simple означает, что сервис будет считать себя запущенным, как только будет инициирована команда в ExecStart.
    • Мы используем stdbuf -o0 для того, чтобы обеспечить немедленное вывод логов, без буферизации.
    • SyslogIdentifier=upgrades позволяет нам идентифицировать логи при их просмотре с помощью journalctl.
  3. Сохраните файл и выйдите из редактора.

  4. Загрузите новую конфигурацию systemd и активируйте сервис:

    sudo systemctl daemon-reload
    sudo systemctl start unattended-upgrades-tailer.service
    sudo systemctl enable unattended-upgrades-tailer.service
  5. Просматривайте логи с помощью journalctl:

    Чтобы просматривать логи, вы можете использовать команды:

    journalctl -t upgrades

    или

    journalctl -u unattended-upgrades-tailer.service

Обратите внимание, что вы не сможете напрямую видеть логи unattended-upgrades через journalctl -u unattended-upgrades.service, так как они не будут направлены туда. Однако, добавляя идентификатор SyslogIdentifier, вы сможете очень удобно фильтровать вывод журналов.

Если вам нужно, чтобы логи отображались как часть unit-файла unattended-upgrades, потребуется использование более сложного подхода, например, создание обертки с использованием systemd-cat, но для большинства случаев вышеописанный метод будет достаточно простым и эффективным.

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

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