Tengo un script simple que genera un montón de registros en la pantalla y canalicé el STDOUT a un archivo para almacenar los registros. Dado que este script se ejecuta durante mucho tiempo, necesitaba rotar los archivos de registro para que se coloquen en otros más pequeños y manejables.
El problema que enfrenté fue que una vez que logrotate
mueve el archivo de registro actual a uno nuevo, el archivo de registro recién creado ya no se rellena con los registros. Parece que una vez que se elimina el archivo de registro original, se pierde su controlador de archivos y la redirección ya no funcionará.
También encontré esta publicación que tenía el mismo problema que yo y afirma que se puede solucionar usando en >>
lugar de >
redirigir la salida. Probé su solución pero no funcionó para mí. ¿Alguien tiene alguna idea de cómo mantener el trabajo de redirección?
Respuestas:
Debe usar la directiva copytruncate en su configuración logrotate para este archivo de registro.
fuente
compress
operación, los datos se duplican. Eso nos causó un problema una vez, pero fue nuestro mal ya que no deberíamos haber estado tan cerca dellv
límite de espacio. Además, como se indica en elman
fragmento, puede perder algunos datos de registro entre las operaciones de copia y truncamiento.Como alternativa, también puede:
use la utilidad de registro en su secuencia de comandos en lugar de tuberías, con una instalación dedicada (por ejemplo, local5), por ejemplo:
logger -p local5.info -t myscriptname "this is some log data"
configure syslog para escribir esta función en el archivo de registro deseado, ejemplo (rsyslog.conf):
local5.* /var/log/mylogfile
configurar la regla de rotación de registros para este registro.
fuente
echo
. El resultado de las herramientas de terceros que se llaman desde el script y que también generan algo no se pueden redirigir al registrador de esta maneraOtra alternativa a la solución de Iain es usar un
postrotate
script para relanzar su script una vez que la rotación ha tenido lugar. Esto se hace para muchos demonios (reiniciar o volver a cargar el demonio), pero sin conocer su script, no sé si esta solución le conviene o no (¿su script depende de algún estado generado hace un tiempo?).Contenido de
/etc/logrotate.d/your-script-name
:fuente
Puede canalizar stdout a "split" (parte de coreutils en linux). Le permite dividir el archivo / stdin en fragmentos según el tamaño, el número de líneas, etc. Una vez que lo haya fragmentado, puede administrarlo con logrotate si es necesario.
fuente