cómo implementar logrotate en script de shell

12

test.sh

#!/bin/bash
echo "Hello World"

test2.sh

#!/bin/bash
while true
do
    sh test.sh >> /script_logs/test.log &
done

Quiero implementar logrotate para controlar el tamaño del archivo de registro, entonces, ¿cómo implementar el logrotate, si la situación es como la anterior?

Veerendra
fuente

Respuestas:

11
#!/bin/bash 
touch /script_logs/test.log
MaxFileSize=2048
while true
do
     sh test.sh >> /script_logs/test.log
#Get size in bytes** 
    file_size=`du -b /script_logs/test.log | tr -s '\t' ' ' | cut -d' ' -f1`
    if [ $file_size -gt $MaxFileSize ];then   
        timestamp=`date +%s`
        mv /script_logs/test.log /script_logs/test.log.$timestamp
        touch /script_logs/test.log
    fi

done

He eliminado el "&", ya que puede causar un problema.

curioso
fuente
@Veerendra tenemos que poner la lógica de tirar los registros dentro del bucle que se está ejecutando un bucle infinito ..
curiosa
@Veerendra, mi publicación anterior tuvo un error ... "mv" no creará un nuevo archivo, pero puede cambiar el script de acuerdo con sus requisitos.
curioso
Entonces, en lugar de cpy mv, ¿puedo eliminar el archivo de registro, entonces será un nuevo archivo de registro con el mismo nombre? (Mi requisito es, si el archivo de registro alcanza cierto límite, quiero eliminar ese archivo de registro y luego crear un nuevo archivo )
Veerendra
Debe usar >>para agregar al archivo de registro, >lo sobrescribirá una y otra vez.
alcik
si lo uso >, obtengo tail: test.log: file truncated Hello World!... Si lo uso >>, recibo el mensaje de registro correcto, pero el tamaño del archivo está aumentando. Sin condición comprobando la condición ... ;-(
Veerendra
24

¿ savelogQué hay de usar ?

Está disponible en Debian y RH y prácticamente en cualquier otra distribución de Linux que conozco. Es un script de shell / bin / sh, por lo que también debería ejecutarse en cualquier otro Unix.

por ejemplo, antes de escribir cualquier cosa para test.logejecutar savelog -n -c 7 test.log. Esto mantendrá las 7 versiones no vacías más recientes de test.log. Por defecto, comprimirá los registros rotados (pero eso se puede desactivar con -l).

Si lo necesita, puede verificar el tamaño test.logy solo savelogsi supera un cierto tamaño.

cas
fuente
¿Alguna idea de qué paquete contiene esto en AWS Linux (creo que cerca de CentOS)? La instalación predeterminada no tiene savelog. No puedo encontrarlo desde yum usando
repositorios
savelog no se encuentra en RHEL 5. ¿Sabe en qué repositorio debería estar?
Felipe Alvarez
no tengo ni idea acerca de los paquetes centos o rhel5, pero puede encontrar el /usr/bin/savelogscript de shell en sources.debian.net/src/debianutils/4.7
cas
2
No he encontrado savelogninguno de mis cuadros RHEL / CentOS 5/6, así que lo descargué ad hoc y parece funcionar bien para mis necesidades.
Dale Anderson
Una desventaja saveloges que cambia el nombre del archivo pero luego toma mucho tiempo descomprimir los viejos antes de terminar. Mientras tanto, el registro .0 ya recibe entradas para los próximos días. Idealmente, el tiempo entre la rotación del registro y la señalización del proceso para volver a abrir el registro debe ser mínimo. Desactivo savelogla función de compresión debido a esto.
rustyx
2

Escribí un logrotee este fin de semana. Probablemente no lo haría si hubiera leído la excelente respuesta demultilog @ JdeBP .

Me centré en que fuera ligero y capaz de bzip2 sus fragmentos de salida como:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

Sin embargo, todavía hay mucho por hacer y probar.

Victor Sergienko
fuente
0

Como todavía no puedo agregar comentarios a la respuesta aceptada , una sugerencia de BusyBox , donde duno tiene una -bbandera:

du /var/log/file | tr -s '\t' ' ' | cut -d' ' -f1
lnksz
fuente