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

Я пытаюсь перенаправить 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 ответов


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

используйте следующие свойства в файле модуля службы systemd:

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

затем, предполагая, что ваш дистрибутив использует rsyslog для управления syslogs, создайте файл в /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.

на systemd.exec(5) man-страница объясняет другие параметры, связанные с журналированием. См. также 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 to file:YOUR_ABSPATH_FILENAME.


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

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

эта новая функция относительно новая и поэтому недоступна для старых дистрибутивов, таких как 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 в /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

конфигурация 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