Как я заставляю systemd единицу перенаправлять или копировать журналы в системный журнал?

Я выполняю Сервер Ubuntu 16.04 с node.js сервисом, где я должен был записать журнал в файл, точно так же, как старый добрый системный журнал :)

Я гуглил половину ночи, но ничто не подошло.

Причина позади этой нечетной потребности, то, что мы собираем журналы через filebeat и отправляем его в кластер ElasticSearch.

3
задан 7 July 2017 в 04:06

2 ответа

Найденный обходным решением с помощью systemd для выполнения journalctl сразу после запуска сервиса я должен получить журнал от.

Добавьте systemd сервисный сценарий для создания файла журнала для "MyService" /etc/systemd/system/multi-user.target.wants/MyService-journalctl-to-log.service:

[Unit]
Description=MyService journalctl parser to filebeat
#I needed to get a log file for filebeat to read
#Wants=filebeat.service
#After=filebeat.service

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sh -c '/bin/journalctl --no-tail -f -u MyService.service  > /var/log/MyService.log 2>&1'
ExecStartPre=/bin/journalctl --vacuum-size=10M

[Install]
WantedBy=multi-user.target

Включите и запустите новый systemd сервис

systemctl enable MyService-journalctl-to-log.service
systemctl start MyService-journalctl-to-log.service
2
ответ дан 1 December 2019 в 16:54

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Если какой-либо из каталогов ошибочен, сообщите мне об этом или отредактируйте его самостоятельно, если можете. Я пишу это из головы.

Я знаю, что это устарело, но если ваша версия SystemD достаточно современна, вы можете использовать ее в своих интересах. Вы можете позволить уже существующим службам и расписаниям ОС делать то, для чего они нужны. Ваш юнит-файл может указать демону, что выходные данные должны отправляться в системный журнал (man systemd.exec)

[Unit]
Description=...

[Service]
WorkingDirectory=...
User=...
Group=...

StandardOutput=syslog
StandardError=inherit

SyslogIdentifier=<program-name>
SyslogFacility=local4 # just because... choose your own

ExecStart=... your command

[Install]
WantedBy=multi-user.target

Поместите файл в /usr/local/lib/systemd/system/, поэтому что вы не смешиваете свои юнит-файлы с другими сопровождающими пакетов (man systemd.unit я думаю)

Не забудьте сообщить SystemD, что этот юнит доступен (или изменен):

sudo systemctl daemon-reload

Это добавит файл вашего модуля в каталог multi-user.target.

Теперь, когда ваши выходные данные направляются в rsyslog, пришло время сообщить rsyslogd, что с ними делать. Заполните /etc/rsyslog.conf.d/10-.conf следующими инструкциями

if ($programname == "<your-programname>") then {
        action(
                type="omfile"
                FileOwner="syslog"
                FileGroup="adm"
                File="/var/log/<programname>/<programname>.log"
                FileCreateMode="0644"
        )
        stop
}

если у вас отсутствуют какие-либо каталоги, создайте их. Не забудьте указать правильные права собственности и разрешения.Каталоги журналов можно настроить для syslog:adm.

Перезапустите rsyslogd, чтобы он принял конфигурацию.

Но мы еще не закончили. Файл будет просто расти без остановки. Настройте logrotate, чтобы разрешить ротацию журналов. Поместите следующую конфигурацию в /etc/logrotate.conf.d/

/var/log/<programname>
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
}

Это всего лишь базовая настройка. Внесите свои личные настройки (есть много справочных страниц, которые нужно прочитать). Службы logrotate нет, это просто запланированная задача, которая обычно запускается каждый день (не помню, cron или anacron).

Будьте осторожны, если ваши журналы растут слишком быстро за один день. Если вы хотите, чтобы logrotate работал по-другому (например, на основе размера), необходимо сделать что-то еще.

0
ответ дан 13 November 2020 в 21:23

Другие вопросы по тегам:

Похожие вопросы: