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>.confcon 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 -uaún funciona pero no se envía nada al archivo especificado.~está en desuso ystopdebería usarse en su lugar. También tenga en cuenta que la segunda línea puede acortarse& stopsi las dos se suceden./etc/rsyslog.d/<newfile>.confcontenidos a::programname, isequal, "<your program identifier>" /var/log/somelog.logAquí 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 .htmlrsyslogtiene su propio usuariosyslogy tiene que tener acceso de escritura a la ubicación de los registros. Así que utilícelo enchownconsecuencia Espero que esto ayude a alguien.Si tiene una distribución más nueva con una más nueva
systemd(systemdversión 236 o más reciente ), puede establecer los valores deStandardOutputoStandardErrorparafile:YOUR_ABSPATH_FILENAME.Larga historia:
En las versiones más recientes de
systemdhay 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 deStandardOutputoStandardErrorparafile:YOUR_ABSPATH_FILENAME. Lafile:pathopció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
copytruncateinlogrotate.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.loga esto:2>&1 >> /var/log.log. GraciasSugeriría agregar
stdoutystderrarchivar en elservicearchivo 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.execpá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/syslogConfig 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