Как перенаправить вывод 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 ответов:
Я думаю, что есть более элегантный способ решить эту проблему: отправить 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