Estoy tratando de redirigir la salida de un servicio systemd a un archivo, pero parece que no funciona:
[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.targetPor favor, corrija mi enfoque.
Posiblemente obtenga este error:
Failed to parse output specifier, ignoring: /var/log1.log Desde la página del comando man systemd.exec(5) :
StandardOutput=Controla dónde se conecta el descriptor de archivo 1 (STDOUT) de los procesos ejecutados. Toma uno de
inherit,null,tty,journal,syslog,kmsg,journal+console,syslog+console,kmsg+consoleosocket.
La página del comando man systemd.exec(5) explica otras opciones relacionadas con el registro. Consulte también las systemd.service(5) y systemd.unit(5) .
O tal vez puedas probar cosas como esta (todo en una sola línea):
ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log'Supongamos que los registros ya están colocados en stdout/stderr y tienen el registro de la unidad systemd en /var/log/syslog
journalctl -u unitxxx.service Jun 30 13:51:46 host unitxxx[1437]: time="2018-06-30T11:51:46Z" level=info msg="127.0.0.1 Jun 30 15:02:15 host unitxxx[1437]: time="2018-06-30T13:02:15Z" level=info msg="127.0.0.1 Jun 30 15:33:02 host unitxxx[1437]: time="2018-06-30T13:33:02Z" level=info msg="127.0.0.1 Jun 30 15:56:31 host unitxxx[1437]: time="2018-06-30T13:56:31Z" level=info msg="127.0.0.1Config rsyslog (Servicio de registro del sistema)
# Create directory for log file mkdir /var/log/unitxxx # Then add config file /etc/rsyslog.d/unitxxx.conf if $programname == 'unitxxx' then /var/log/unitxxx/unitxxx.log & stopReiniciar rsyslog
systemctl restart rsyslog.serviceCreo que hay una manera más elegante de resolver el problema: envíe el 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, asumiendo que su distribución usa rsyslog para administrar syslogs, cree un archivo en /etc/rsyslog.d/<new_file>.conf con el siguiente contenido:
if $programname == '<your program identifier>' then /path/to/log/file.log & stopAhora haga que el archivo de registro sea escribible 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 seguirá estando disponible a través de journalctl ( sudo journalctl -u <your program identifier> ) pero también estarán disponibles en su archivo de elección.
Si por alguna razón no puede usar rsyslog, esto funcionará: ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"
Si tiene una distribución más nueva con un systemd más nuevo ( systemd versión 236 o más reciente ), puede establecer los valores de StandardOutput o StandardError en file:YOUR_ABSPATH_FILENAME .
Larga historia:
En las versiones más nuevas de systemd , hay una opción relativamente nueva ( la solicitud de github es de 2016 ish y la mejora se fusionó/cerrado 2017 ish ) donde puede establecer los valores de StandardOutput o StandardError en file:YOUR_ABSPATH_FILENAME . La opción file:path está documentada en la página man más reciente systemd.exec .
Esta nueva función es relativamente nueva y, por lo tanto, no está disponible para distribuciones más antiguas como centos-7 (o cualquier centos anterior).
Sugeriría agregar el archivo stdout y stderr en el propio archivo de service systemd.
Referencia: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=
Como lo has configurado no debería gustarte:
StandardOutput=/home/user/log1.log StandardError=/home/user/log2.logDebería ser:
StandardOutput=file:/home/user/log1.log StandardError=file:/home/user/log2.logEsto funciona cuando no desea reiniciar el servicio una y otra vez .
Esto creará un nuevo archivo y no se agregará al archivo existente.
Utilice en su lugar:
StandardOutput=append:/home/user/log1.log StandardError=append:/home/user/log2.logNOTA: Asegúrese de crear el directorio ya. Supongo que no es compatible con la creación de un directorio.
Estamos usando Centos7, aplicación de arranque de primavera con systemd. Estaba ejecutando Java como se muestra a continuación. y establecer StandardOutput en el archivo no funcionaba para mí.
ExecStart=/bin/java -jar xxx.jar -Xmx512-Xms32MA continuación, la solución alternativa funciona sin configurar StandardOutput. ejecutando Java a través de sh como se muestra a continuación.
ExecStart=/bin/sh -c 'exec /bin/java -jar xxx.jar -Xmx512M -Xms32M >> /data/logs/xxx.log 2>&1'Respuesta corta:
StandardOutput=file:/var/log1.log StandardError=file:/var/log2.logSi no desea que los archivos se borren cada vez que se ejecuta el servicio, use append en su lugar:
StandardOutput=append:/var/log1.log StandardError=append:/var/log2.log