Я думаю, что есть более элегантный способ решения проблемы: отправьте stdout / stderr в syslog с идентификатором и дайте команду своему администратору 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
Теперь сделайте файл журнала доступным для записи с помощью syslog:
# ls -alth /var/log/syslog
-rw-r----- 1 syslog adm 439K Mar 5 19:35 /var/log/syslog
# chown syslog:adm /path/to/log/file.log
Перезапустите rsyslog ( sudo systemctl restart rsyslog
) и наслаждайтесь! Ваша программа stdout / stderr по-прежнему будет доступна через journalctl ( sudo journalctl -u <your program identifier>
), но они также будут доступны в выбранном вами файле.
Источник через archive.org
journalctl -u
все еще работает, но в указанный файл ничего не отправляется.~
устарел иstop
должен использоваться вместо этого. Также обратите внимание, что вторая строка может быть сокращена до& stop
того момента, когда эти два следуют друг за другом./etc/rsyslog.d/<newfile>.conf
содержимое на::programname, isequal, "<your program identifier>" /var/log/somelog.log
Вот документация по фильтрам rsyslog : rsyslog.com/doc/v8-stable/configuration/filters.html А вот документы по таким свойствам, какprogramname
: rsyslog.com/doc/master/configuration/properties .htmlrsyslog
нее есть собственный пользователь,syslog
и у нее должен быть доступ на запись к местоположению журналов. Так что используйтеchown
соответственно. Надеюсь, это кому-нибудь поможет.Если у вас есть новый дистрибутив с более новой
systemd
(systemd
версии 236 или более поздней версии ), вы можете установить значенияStandardOutput
илиStandardError
вfile:YOUR_ABSPATH_FILENAME
.Длинная история:
В более новых версиях
systemd
есть относительно новый вариант ( запрос GitHub от 2016 иша и повышение слито / закрыто 2017 МОГЛИ ) , где вы можете установить значениеStandardOutput
илиStandardError
вfile:YOUR_ABSPATH_FILENAME
.file:path
Опция описана в самой последнейsystemd.exec
странице человека .Эта новая функция является относительно новой и поэтому недоступна для более старых дистрибутивов, таких как centos-7 (или любые другие centos до этого).
источник
copytruncate
inlogrotate
.Возможно, вы получите эту ошибку:
Со
systemd.exec(5)
страницы руководства :Страница
systemd.exec(5)
man объясняет другие опции, связанные с регистрацией. Смотрите также страницы mansystemd.service(5)
иsystemd.unit(5)
man.Или, может быть, вы можете попробовать что-то вроде этого (все в одной строке):
источник
journalctl -u your-unit-name
.The fd option connects the output stream to a single file descriptor provided by a socket unit. A custom named file descriptor can be specified as part of this option, after a ":" (e.g. "fd:foobar").
2>&1 > /var/log.log
на это:2>&1 >> /var/log.log
. СпасибоЯ бы предложил добавить
stdout
иstderr
файл вservice
самом файле systemd .Ссылка: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=
Как вы настроили это не должно нравиться:
Так должно быть:
Это работает, когда вы не хотите перезапускать сервис снова и снова .
Это создаст новый файл и не добавится к существующему файлу.
Используйте вместо:
ПРИМЕЧАНИЕ. Убедитесь, что вы уже создали каталог. Я думаю, что это не поддерживает создание каталога.
источник
file:
маршрут работает при первой загрузке сервиса, но при последующих перезапусках он больше не записывает в файл. Я пыталсяappend:
из документов, и это не сработало вообще.file:
записывает в начало файла каждый раз и не усекает ... далее,append:
кажется, это новое дополнение (то есть, отсутствует наman systemd.exec
странице в Ubuntu 18.04).Если по какой-то причине нельзя использовать 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 , и в них есть вход системного модуля
/var/log/syslog
Config rsyslog (служба ведения журнала системы)
Перезапустите rsyslog
источник
Мы используем Centos7, приложение весенней загрузки с systemd. Я работал на Java, как показано ниже. и установка StandardOutput для файла не работает для меня.
Ниже обходное решение работает без настройки StandardOutput. запустить Java через Sh, как показано ниже.
источник
Короткий ответ:
Если вы не хотите, чтобы файлы очищались при каждом запуске службы, используйте вместо этого команду append:
источник