Как перенаправить вывод 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