2016-06-02 7 views
43

Я пытаюсь перенаправить o/p службы systemd в файл, но он не работает. Я делаю это следующим образом:Как перенаправить вывод службы 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 

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

ответ

61

Я думаю, что есть более элегантный способ решения проблемы: отправить стандартный вывод/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 
if $programname == '<your program identifier>' then ~ 

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

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

+0

Отлично подходит для настройки ведения журнала для приложения SpringBoot ... –

+3

Не работает для меня на Ubuntu 16.04. 'journalctl -u' по-прежнему работает, но ничего не отправляется в указанный файл. –

+0

Это отлично работает на растяжке Debian, однако он жалуется, что '~' устарел, и вместо этого следует использовать 'stop'. Также обратите внимание, что вторая строка может быть сокращена до '& stop', если они приходят друг за другом. – jlh

18

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

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

На странице systemd.exec(5) людей:

StandardOutput=

Controls where file descriptor 1 (STDOUT) of the executed processes is connected to. Takes one of inherit , null , tty , journal , syslog , kmsg , journal+console , syslog+console , kmsg+console or socket .

systemd.exec(5) man page объясняет другие варианты r пригоден для регистрации. См. Также справочные страницы 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' 
+5

Среди возможных вариантов, вход в журнал systemd рекомендуется. Вы просматриваете журналы только для своего процесса в журнале, используя 'journalctl -u your-unit-name'. –

+6

Чтобы указать файл, есть еще один параметр очистки, как указано в документации: 'Опция fd соединяет выходной поток с одним файловым дескриптором, предоставляемым модулем сокета.Пользовательский именный файловый дескриптор может быть указан как часть этой опции после «:» (например, «fd: foobar»). ' – orion

+2

@orion: Пожалуйста, сделайте это отдельным ответом. :-) –

4

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

3

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


Длинная история:

В новых версиях systemd есть относительно новый вариант (the github request is from 2016 ish and the enhancement is merged/closed 2017 ish), где вы можете установить значение StandardOutput или StandardError к file:YOUR_ABSPATH_FILENAME. Опция file:path документирована в most recent systemd.exec man page.

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