Pregunta ¿Cómo limitar un archivo de registro a las últimas N líneas?


tengo un ./program que genera muchos mensajes de registro y también tiene un espacio de almacenamiento muy limitado en mi VPS:

Me gustaría que mi archivo de registro contenga solo las últimas N líneas  todo el tiempo (o más bien cuando termino ^ C mi programa o cuando se cuelga ...)

A. Yo hago no quiero lo siguiente:

  1. "Redirige la salida a un archivo (log-) y luego usa tail para mantener solo las últimas N líneas ".

    Bueno, el archivo de registro aún tomaría un espacio valioso hasta que corro tail en él, lo que lo hace inútil ... Puedo configurar un cronjob para que lo haga periódicamente si no tengo otra opción, pero me gustaría explorar las posibilidades primero.

  2. "Utilizar logrotate"

    logrotate parece ser la solución adecuada al problema, pero es demasiado complicado y quiero algo más simple, preferiblemente algo que pueda hacer con tuberías y redirecciones.

B. He intentado lo siguiente:

(reemplazado ./program con seq 1000000 si para la prueba)

  1. seq 1000000 | tee /dev/fd/2 | tail -n 10 > logfile

    Funciona perfectamente bien cuando termina solo, pero cuando interrumpo ^ C yo mismo, el logfile está vacío (mientras que yo espero que contenga las últimas 10 líneas que están impresas en la pantalla tee)

  2. mkfifo fifo; tail fifo -n 10 > logfile & seq 1000000 | tee fifo

    Funciona perfectamente bien cuando termina solo, pero cuando interrumpo ^ C yo mismo, el logfile es no vacío, pero tampoco contiene un poco de las últimas entradas de registro que se imprimen en la pantalla:

.

$ tail fifo -n 10 > logfile & seq 1000000 | tee fifo
[1] 2616
1
2
3
⋮
480178
480179
480180
480181
480182
480183
^C
[1]+  Done                    tail fifo -n 10 > logfile
$ cat logfile
479297
479298
479299
479300
479301
479302
479303
479304
479305

Aquí puede ver que las últimas entradas están en 480 mil, mientras que la última entrada en el logfile es 479.305 ... lo que significa que echo de menos 878 últimas líneas! Creo que esto tiene algo que ver con el almacenamiento en búfer, pero no estoy seguro.

¿Alguien puede mostrarme cómo hacer esto usando solo shell y (preferiblemente estándar) utilidades de Linux? ¡Gracias!


0


origen


Personalmente utilizo un cron que se ejecuta todos los días a las 12:12:12 am para purgar los archivos de registro ... ya que se reducen a tamaño diario, nunca se vuelven grandes, por lo que cron genera algunos html en un archivo que se incluye en una página de estado personal (mezcla de php y html) que me permite vigilar rápidamente las cosas. - Tyson


Respuestas:


La solución más simple para su caso es probablemente un registro circular, que tiene un tamaño fijo.

Si estás en Linux, puedes probar el módulo kernel emlog 

El módulo del núcleo emlog implementa un controlador de dispositivo de carácter simple. El controlador actúa como una tubería con nombre que tiene un buffer circular finito. El tamaño del buffer es fácilmente configurable. A medida que se escriben más datos en el búfer, los datos más antiguos se descartan. Un proceso que se lee desde un dispositivo emlog primero leerá el búfer existente, luego verá el nuevo texto tal como está escrito, similar a la supervisión de un archivo de registro usando "tail -f". (También se admiten lecturas sin bloqueo, si un proceso necesita obtener el contenido actual del registro sin bloqueo para esperar nuevos datos).

En los sistemas BSD ver CLOG(8)


0