Myślę, że istnieje bardziej elegancki sposób rozwiązania problemu: wyślij stdout / stderr do syslog z identyfikatorem i poinstruuj swojego menedżera syslog, aby podzielił dane wyjściowe według nazwy programu.
Użyj następujących właściwości w pliku systemowym jednostki usługowej:
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote
Następnie, zakładając, że twoja dystrybucja używa rsyslog do zarządzania syslogami, utwórz plik /etc/rsyslog.d/<new_file>.conf
o następującej treści:
if $programname == '<your program identifier>' then /path/to/log/file.log
& stop
Teraz spraw, aby plik dziennika był zapisywalny przez 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
Uruchom ponownie rsyslog ( sudo systemctl restart rsyslog
) i baw się! Twój program stdout / stderr będzie nadal dostępny przez journalctl ( sudo journalctl -u <your program identifier>
), ale będą one również dostępne w wybranym przez Ciebie pliku.
Źródło: archive.org
journalctl -u
nadal działa, ale nic nie jest wysyłane do określonego pliku.~
jest przestarzałe istop
powinno być używane zamiast tego. Zwróć również uwagę, że druga linia może zostać skrócona,& stop
jeśli obie następują po sobie./etc/rsyslog.d/<newfile>.conf
zawartość na::programname, isequal, "<your program identifier>" /var/log/somelog.log
Oto dokumentacja dotycząca filtrów rsyslog : rsyslog.com/doc/v8-stable/configuration/filters.html A tutaj dokumenty dotyczące właściwości, takie jakprogramname
: rsyslog.com/doc/master/configuration/properties .htmlrsyslog
ma ona własnego użytkownikasyslog
i musi mieć dostęp do zapisu w lokalizacji logów. Więc używajchown
odpowiednio. Mam nadzieję, że to komuś pomoże.Jeśli masz nowszą dystrybucję z nowszą
systemd
(systemd
wersja 236 lub nowsza ), możesz ustawić wartościStandardOutput
lubStandardError
nafile:YOUR_ABSPATH_FILENAME
.Długa historia:
W nowszych wersjach
systemd
jest stosunkowo nowa opcja ( żądanie github pochodzi z 2016 ish, a ulepszenie jest połączone / zamknięte 2017 ish ), w której można ustawić wartościStandardOutput
lubStandardError
dofile:YOUR_ABSPATH_FILENAME
.file:path
Opcja jest udokumentowane w najnowszejsystemd.exec
manualu .Ta nowa funkcja jest stosunkowo nowa, więc nie jest dostępna dla starszych dystrybucji, takich jak centos-7 (ani wcześniejszych centów).
źródło
copytruncate
inlogrotate
.Prawdopodobnie pojawi się ten błąd:
Ze strony podręcznika
systemd.exec(5)
:systemd.exec(5)
Strona podręcznika opisuje inne opcje związane z wyrębu. Zobacz także strony mansystemd.service(5)
isystemd.unit(5)
.A może możesz wypróbować takie rzeczy (wszystko w jednej linii):
źródło
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
do tego:2>&1 >> /var/log.log
. DziękujęSugerowałbym dodanie
stdout
istderr
zapisanie w samymservice
pliku systemd .Odsyłacze: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=
Jak skonfigurowałeś, nie powinno to lubić:
Powinno być:
Działa to, gdy nie chcesz ponownie uruchamiać usługi ponownie .
Spowoduje to utworzenie nowego pliku i nie zostanie dołączone do istniejącego pliku.
Użyj zamiast:
UWAGA: Upewnij się, że utworzyłeś już katalog. Myślę, że to nie obsługuje tworzenia katalogu.
źródło
file:
trasa działa przy pierwszym załadowaniu usługi, ale przy kolejnych restartach nie zapisuje już do pliku. Próbowałemappend:
z doktorów i to w ogóle nie działało.file:
za każdym razem zapisuje na początku pliku i nie obcina ... dalej,append:
wydaje się być nowym dodatkiem (tj.man systemd.exec
Nieobecnym na stronie w Ubuntu 18.04).Jeśli z jakiegoś powodu nie możesz użyć rsyslog, wystarczy:
ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"
źródło
Załóżmy, że dzienniki są już umieszczone na stdout / stderr i muszą zalogować się do jednostki systemowej
/var/log/syslog
Config rsyslog (usługa rejestrowania systemu)
Uruchom ponownie rsyslog
źródło
Używamy Centos7, aplikacji Spring Boot z systememd. Uruchomiłem java jak poniżej. i ustawienie StandardOutput na plik nie działało.
Poniżej rozwiązanie obejścia działające bez ustawiania StandardOutput. uruchamianie javy przez sh, jak poniżej.
źródło
Krótka odpowiedź:
Jeśli nie chcesz, aby pliki były czyszczone za każdym razem, gdy usługa jest uruchamiana, użyj zamiast tego append:
źródło