¿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. .
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.
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
* 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
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)
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.
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
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.