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

13

¿Hay alguna manera de mantener fijo el tamaño del archivo de registro sin rotarlo por un nuevo archivo vacío y eliminar (o archivar) el archivo antiguo? 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 bloqueará automáticamente, el texto se agregará en 'cola' y la parte más antigua del texto se extraerá para mantener el tamaño del archivo 1 MB .

uray
fuente
use logrotate, entoncesrm -f *.tar.gz.*
Marco Ceppi
1
¿Hay alguna razón particular por la que no desea rotar el registro o utilizar logrotate? ¿Exactamente qué quieres que suceda? ¿Archivar el registro antiguo a 1M y comenzar uno nuevo? El comienzo de su pregunta no es del todo compatible con el final.
David Thornley
¿Qué significa poped out ?
tshepang

Respuestas:

4

Podrías escribir un pequeño script bash para hacer esto. Simplemente ajuste el archivo a un cierto recuento de bytes usando tail -cy 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.
jjclarkson
fuente
3
Estoy relativamente seguro de que una vez que "sobrescriba el archivo", el registro no se reanudará automáticamente en el nuevo archivo.
Stephen Jazdzewski
0

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 el sistema de archivos en el espacio de usuario

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

Desearía tener el tiempo para hacerlo, siempre he querido algo exactamente como esto.

Stephen Jazdzewski
fuente
0

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

Sin embargo, tenga en cuenta que si nada está LEYENDO desde 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 ha cambiado con las versiones más nuevas de Ubuntu / CentOS.

Un ejemplo aqui

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 "Prueba *" en la salida de catarriba.

Esta característica 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 de firewall, puede hacer algo como esto:

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

Aquí está mi segunda respuesta. Este es un muy hackish.

Use watch (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 ver el archivo con:

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

La diferencia entre watchy un ciclo while es que watchsolo 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ía poner un testbucle while para que la cola solo se ejecute si se actualizó / var / log / messages, pero no lo entenderé ahora.

Stefan Lasiewski
fuente
0
 * podar: corta 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 el registro
 * archivos que crecen para siempre. Este archivo contiene una lista de
 * archivos (nombre de ruta completo) y la cantidad de bloques que
 * debe ser retenido. Para conservar la cordura, podarás
 * recorta el archivo después de la próxima línea nueva. El archivo
 * / etc / default / prune debería verse así:
 * *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / messages 200
 * / usr / adm / sup_log 5
 * *
 * La entrada crontab en infoswx para ciruela se ve así:
 * *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 * *
 * Compilar con: cc -O -o prune prune.c
 * *
 * Las siguientes definiciones pueden ajustarse a su gusto.
 * y el tamaño del bloque de su sistema.
 * *
 * Ray Davis infoswx! Abejas 25/09/85

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

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

RedGrittyBrick
fuente
0

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

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

run_program | curtail -s 200M myprogram.log

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

Dave Wolaver
fuente