Cómo registrar correctamente los registros de servicio administrados por systemd a través de `file:` config
Tengo un servicio administrado por systemd que tiene la siguiente configuración de systemd que le dice a systemd que escriba los registros en un archivo directamente (sin syslog ni nada)
StandardOutput=file:/var/log/foo/my.log
Tengo una regla de logrotate
/var/log/foo/*.log
{
rotate 31
daily
missingok
notifempty
compress
delaycompress
sharedscripts
}
Lo que sucede es que los registros se están rotando, pero el servicio todavía está escribiendo en el antiguo archivo rotado y el nuevo archivo de registro permanece vacío.
Tengo una configuración de trabajo similar en la que el servicio escribe en syslog. Ese funciona bien porque la configuración de logrotate tiene
postrotate
invoke-rc.d rsyslog rotate > /dev/null
, que notifica a syslog que su registro se ha rotado.
El problema es que, en mi caso problemático, el registro va directamente al archivo, por lo que no sé si (o cuál) necesito enviar una señal similar a systemd o al proceso de servicio real.
Encontré la copytruncate
opción en logrotate, que estoy bastante seguro de que solucionará mi problema, pero tengo la sensación de que esta no es la forma ideal de hacerlo, de lo contrario copytruncate
sería el comportamiento predeterminado de logrotate.
¿Cómo soluciono este problema? ¿Necesito enviar alguna señal a systemd? ¿Necesito enviar alguna señal al proceso de servicio? ¿tengo que usar copytruncate
en logrotate en su lugar?
Si importa, el servicio es un proceso java que usa logback para escribir en stdout
Respuestas
copytruncate
es la respuesta correcta en este caso. No es el predeterminado porque es menos común necesitarlo, porque tendría un demonio adecuado al que puede indicar que vuelva a abrir el archivo de registro.
La alternativa es reiniciar el servicio en el script posterior a la rotación, pero eso puede no ser conveniente o deseable.