it-swarm-es.tech

Mantenga el tamaño del archivo de registro fijo sin logrotate

¿Hay alguna forma de mantener fijo el tamaño del archivo de registro sin rotarlo por un nuevo archivo vacío y eliminar (o archivar) el archivo anterior? Por ejemplo, si configuro el tamaño máximo del archivo de registro en 1 MB, después de que el tamaño del archivo aumente más allá de ese límite, se fijará automáticamente, el texto se agregará en 'cola' y la parte más antigua del texto se abrirá para mantener el tamaño del archivo en 1 MB. .

13
uray

Podrías escribir un pequeño script bash para hacer esto. Simplemente siga el archivo a un determinado recuento de bytes usando tail -c y sobrescriba el archivo.

de man tail:

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
4
jjclarkson

Estoy seguro de que el cartel original ha encontrado una solución después de 8 años. Aquí hay otro para otros que pueden leer este hilo ...

restringir limita el tamaño de la salida de un programa y conserva los últimos 200 MB de salida con el siguiente comando:

run_program | recortar -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

0
Dave Wolaver
 * Prune: recorta la parte superior de una lista de archivos descritos en el archivo 
 */Etc/default/Prune. Diseñado para ejecutarse periódicamente 
 * Desde cron, la idea es acortar automáticamente los archivos de registro 
 * Que crecen para siempre. Este archivo contiene una lista de 
 * Archivos (nombre de ruta completo) y el número de bloques que 
 * Deben conservarse. Para mantener un poco de cordura, Prune 
 * Recortará el archivo después de la siguiente línea nueva. El archivo 
 */Etc/default/Prune debería tener un aspecto similar a: 
 * 
 */Usr/adm/aculog 10 
 */Usr/adm/leo .log 5 
 */usr/adm/messages 200 
 */usr/adm/sup_log 5 
 * 
 * La entrada crontab en infoswx para Prune parece : 
 * 
 * 0 5 * * */etc/Prune> /usr/adm/Prune.log 2> & 1 
 * 
 * Compilar con: cc -O -o Prune prune.c 
 * 
 * Las siguientes definiciones se pueden ajustar para adaptarse a su gusto 
 * Y al tamaño de bloque de su sistema. 
 * 
 * Ray Davis infoswx! Bees 25/09/85 

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=es&ie=UTF-8&q=Prune+log+file&pli=1

Muchos (¿la mayoría? ¿Todos?) Demonios volverán a abrir sus archivos de registro si se les envía una señal HUP (por ejemplo, mediante el mismo trabajo cron que ejecuta Prune)

0
RedGrittyBrick

Su única solución puede ser escribir su propio sistema de archivos de espacio de usuario o contribuir a uno existente. Mire la lista parcial en Sistema de archivos en el espacio de usuario

Si no tiene las habilidades para contribuir, ofrezca publicidad de un proyecto o $$$ o ambos, para agregarlo por usted.

Ojalá tuviera tiempo para hacerlo, siempre he querido algo exactamente como esto.

0
Stephen Jazdzewski

Puede hacer algo similar usando un FIFO, que es como un archivo de tamaño de cero bytes.

Sin embargo, tenga en cuenta que si nada está LEYENDO de este archivo, entonces el proceso de syslog puede bloquearse y dejará de escribir en TODOS sus archivos de registro. No estoy seguro de si este comportamiento se ha cambiado con las versiones más recientes de Ubuntu/CentOS.

Un ejemplo aquí

Para otro ejemplo, intente algo como esto.

Haz tu FIFO:

Sudo mkfifo /var/log/everything.fifo

Y agregue esto a (r) syslog.conf, luego reinicie syslog:

*.*     |/var/log/everything.fifo

Luego vea el FIFO desde una ventana:

cat /var/log/everything.fifo

Y en otra ventana, envíe algunas cosas a syslog:

logger Test1
logger Test2
logger Test3

Debería ver las líneas "Test *" en la salida de cat arriba.

Esta función puede ser excelente para la depuración, especialmente si no le importa mantener los datos por más tiempo. Por ejemplo, si solo desea ver todo excepto el spam del cortafuegos, puede hacer algo como esto:

grep -vi "kernel: .* on wan" /var/log/everything.fifo
0
Stefan Lasiewski

Esta es mi segunda respuesta. Este es un truco bastante.

Utilice el reloj (1) para ejecutar repetidamente tail --bytes=1024 (los últimos 1024 bytes del archivo de registro, gracias a @jjclarkson por esa respuesta).

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

Y luego vea el archivo con:

less --raw-control-chars /tmp/messages.watch

La diferencia entre watch y un bucle while es que watch solo actualizará /tmp/messages.watch si hubo cambios en/var/log/messages.

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

Y bueno, supongo que podrías poner test en el bucle while para que la cola solo se ejecute si/var/log/messages se actualizó, pero no lo resolveré ahora.

0
Stefan Lasiewski