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

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

¿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 la "cola" y la parte más antigua del texto aparecerá para mantener el tamaño del archivo en 1 MB. .

Respuesta1

Podrías escribir un pequeño script bash para hacer esto. Simplemente siga el archivo hasta un cierto recuento de bytes 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.

Respuesta2

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

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

ejecutar_programa | reducir -s 200M miprograma.log

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

Respuesta3

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

Si no tienes las habilidades para contribuir, ofrece publicidad del proyecto o $$$ o ambos, para agregarlo por ti.

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

Respuesta4

Aquí está mi segunda respuesta. Este es un truco bastante complicado.

Utilice 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 vea el archivo con:

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

La diferencia entre watchun bucle while y un bucle while es que watchsolo se 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 un testbucle while para que tail solo se ejecute si se actualizó /var/log/messages, pero no lo resolveré ahora.

información relacionada