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?

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.


@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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.