Creo que hay una manera más elegante de resolver el problema: envíe stdout / stderr a syslog con un identificador e indique a su administrador de syslog que divida su salida por nombre de programa.
Use las siguientes propiedades en su archivo de unidad de servicio systemd:
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote
Luego, suponiendo que su distribución esté utilizando rsyslog para administrar syslogs, cree un archivo /etc/rsyslog.d/<new_file>.conf
con el siguiente contenido:
if $programname == '<your program identifier>' then /path/to/log/file.log
& stop
Ahora haga que el archivo de registro sea editable por 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
Reinicie rsyslog ( sudo systemctl restart rsyslog
) y disfrute! Su programa stdout / stderr todavía estará disponible a través de journalctl ( sudo journalctl -u <your program identifier>
) pero también estará disponible en su archivo de elección.
Fuente vía archive.org
journalctl -u
aún funciona pero no se envía nada al archivo especificado.~
está en desuso ystop
debería usarse en su lugar. También tenga en cuenta que la segunda línea puede acortarse& stop
si las dos se suceden./etc/rsyslog.d/<newfile>.conf
contenidos a::programname, isequal, "<your program identifier>" /var/log/somelog.log
Aquí hay documentación sobre los filtros de rsyslog : rsyslog.com/doc/v8-stable/configuration/filters.html Y aquí hay documentos sobre las propiedades comoprogramname
: rsyslog.com/doc/master/configuration/properties .htmlrsyslog
tiene su propio usuariosyslog
y tiene que tener acceso de escritura a la ubicación de los registros. Así que utilícelo enchown
consecuencia Espero que esto ayude a alguien.Si tiene una distribución más nueva con una más nueva
systemd
(systemd
versión 236 o más reciente ), puede establecer los valores deStandardOutput
oStandardError
parafile:YOUR_ABSPATH_FILENAME
.Larga historia:
En las versiones más recientes de
systemd
hay una opción relativamente nueva ( la solicitud de github es de 2016 ish y la mejora se fusionó / cerró 2017 ish ) donde puede establecer los valores deStandardOutput
oStandardError
parafile:YOUR_ABSPATH_FILENAME
. Lafile:path
opción está documentada en la página de manual más recientesystemd.exec
.Esta nueva característica es relativamente nueva y, por lo tanto, no está disponible para distribuciones anteriores como centos-7 (o cualquier centos anterior).
fuente
copytruncate
inlogrotate
.Posiblemente reciba este error:
Desde la
systemd.exec(5)
página del manual:La
systemd.exec(5)
página del manual explica otras opciones relacionadas con el registro. Consulte también las páginassystemd.service(5)
ysystemd.unit(5)
man.O tal vez puedes probar cosas como esta (todo en una línea):
fuente
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
a esto:2>&1 >> /var/log.log
. GraciasSugeriría agregar
stdout
ystderr
archivar en elservice
archivo systemd mismo.En referencia: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=
Como lo ha configurado, no debería gustarle:
Debería ser:
Esto funciona cuando no desea reiniciar el servicio una y otra vez .
Esto creará un nuevo archivo y no se agregará al archivo existente.
Use en su lugar:
NOTA: asegúrese de crear el directorio ya. Supongo que no es compatible para crear un directorio.
fuente
file:
ruta funciona en la primera carga del servicio, pero en los reinicios posteriores ya no escribe en el archivo. Lo intentéappend:
con los documentos y eso no funcionó en absoluto.file:
escribe al inicio del archivo cada vez, y no se trunca ... además,append:
parece ser una nueva adición (es decir, no está presente en laman systemd.exec
página en Ubuntu 18.04).Si por alguna razón no puede usar rsyslog, esto hará:
ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"
fuente
Suponga que los registros ya están en stdout / stderr , y tienen el inicio de sesión de la unidad systemd
/var/log/syslog
Config rsyslog (Servicio de registro del sistema)
Reiniciar rsyslog
fuente
Estamos utilizando Centos7, aplicación de arranque de primavera con systemd. Estaba ejecutando Java como a continuación. y configurar StandardOutput en el archivo no funcionaba para mí.
A continuación, la solución alternativa funciona sin configurar StandardOutput. ejecutando Java a través de sh como a continuación.
fuente
Respuesta corta:
Si no desea que los archivos se borren cada vez que se ejecuta el servicio, use append en su lugar:
fuente