Вопрос или проблема
Я использую 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
.
Вот как вы можете это сделать:
-
Создайте новый unit-файл для системы systemd. Вы можете назвать его, например,
unattended-upgrades-tailer.service
. Откройте терминал и выполните команду:sudo nano /etc/systemd/system/unattended-upgrades-tailer.service
-
Добавьте следующее содержимое в созданный файл:
[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
.
-
Сохраните файл и выйдите из редактора.
-
Загрузите новую конфигурацию systemd и активируйте сервис:
sudo systemctl daemon-reload sudo systemctl start unattended-upgrades-tailer.service sudo systemctl enable unattended-upgrades-tailer.service
-
Просматривайте логи с помощью
journalctl
:Чтобы просматривать логи, вы можете использовать команды:
journalctl -t upgrades
или
journalctl -u unattended-upgrades-tailer.service
Обратите внимание, что вы не сможете напрямую видеть логи unattended-upgrades
через journalctl -u unattended-upgrades.service
, так как они не будут направлены туда. Однако, добавляя идентификатор SyslogIdentifier
, вы сможете очень удобно фильтровать вывод журналов.
Если вам нужно, чтобы логи отображались как часть unit-файла unattended-upgrades
, потребуется использование более сложного подхода, например, создание обертки с использованием systemd-cat
, но для большинства случаев вышеописанный метод будет достаточно простым и эффективным.