Как перенаправить вывод systemd сервиса в файл


Я пытаюсь перенаправить o / p службы systemd в файл, но это, кажется, не работает. Я делаю это следующим образом:

[Unit]
Description=customprocess
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server
StandardOutput=/var/log1.log
StandardError=/var/log2.log
Restart=always

[Install]
WantedBy=multi-user.target

пожалуйста, предложите правильный подход для перенаправления o / p в файл

5 66

5 ответов:

Я думаю, что есть более элегантный способ решить эту проблему: отправить stdout/stderr в syslog с идентификатором и поручить вашему менеджеру системного журнала разделить его вывод по имени программы.

используйте следующие свойства в файле systemd service unit:

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote

затем, предполагая, что ваш дистрибутив использует rsyslog для управления системными журналами, создайте файл в /etc/rsyslog.d/<new_file>.conf следующего содержания:

if $programname == '<your program identifier>' then /path/to/log/file.log
& stop

перезапустить rsyslog (sudo systemctl перезапустить rsyslog) и наслаждайтесь! Ваша программа stdout / stderr по-прежнему будет доступна через journalctl (sudo journalctl-u), но они также будут доступны в вашем файле выбора.

Источник:http://wiki.rsyslog.com/index.php/Filtering_by_program_name

возможно, вы получите эту ошибку:

Failed to parse output specifier, ignoring: /var/log1.log

С systemd.exec(5) man page:

StandardOutput=

элементы управления, к которым подключен файловый дескриптор 1 (STDOUT) выполняемых процессов. Берет один из inherit,null,tty,journal,syslog,kmsg,journal+console,syslog+console,kmsg+console или socket.

The systemd.exec(5) man page объясняет другие параметры, связанные с ведением журнала. Смотрите также раздел systemd.service(5) и systemd.unit(5) справочная страница.

или может быть, вы можете попробовать такие вещи (все на одной строке):

ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log' 

если у вас есть новый дистрибутив с новой systemd (systemd версия 236 или новее), вы можете установить значения StandardOutput или StandardError до file:YOUR_ABSPATH_FILENAME.


долгая история:

в новой версии systemd есть относительно новая опция (запрос github от 2016 ish и улучшение объединено / закрыто 2017 ish) где вы можете установить значения StandardOutput или StandardError до file:YOUR_ABSPATH_FILENAME. Элемент задокументировано в последние systemd.exec на странице.

эта новая функция является относительно новой и поэтому недоступна для более старых дистрибутивов, таких как centos-7 (или любой centos до этого).

Если по какой-то причине не может использовать rsyslog, это будет делать: ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"

предположим, что журналы уже помещены в stdout / stderr, и войти в систему systemd unit /var/log/syslog

journalctl -u unitxxx.service

Jun 30 13:51:46 host unitxxx[1437]: time="2018-06-30T11:51:46Z" level=info msg="127.0.0.1
Jun 30 15:02:15 host unitxxx[1437]: time="2018-06-30T13:02:15Z" level=info msg="127.0.0.1
Jun 30 15:33:02 host unitxxx[1437]: time="2018-06-30T13:33:02Z" level=info msg="127.0.0.1
Jun 30 15:56:31 host unitxxx[1437]: time="2018-06-30T13:56:31Z" level=info msg="127.0.0.1

Config rsyslog (Служба Системного Ведения Журнала)

# Create directory for log file
mkdir /var/log/unitxxx

# Then add config file /etc/rsyslog.d/unitxxx.conf

if $programname == 'unitxxx' then /var/log/unitxxx/unitxxx.log
& stop

перезагрузите rsyslog

systemctl restart rsyslog.service