2012-07-13 8 views
5

Estoy intentando configurar un script donde se genera una alerta cuando aparece una determinada cadena en un archivo de registro.Cómo pasar tail -f en awk

La solución ya implementada grepea todo el archivo de registro una vez por minuto y cuenta la frecuencia con que aparece la cadena, utilizando la marca de tiempo de la línea de registro para contar solo las ocurrencias del minuto anterior.

que pensé que sería mucho más eficiente de hacer esto con una cola, así que trataron los siguientes, como una prueba:

FILENAME="/var/log/file.log" 

tail -f $FILENAME | awk -F , -v var="$HOSTNAME" ' 
       BEGIN { 
         failed_count=0; 
       } 
       /account failure reason/ { 
         failed_count++; 
       } 
       END { 
         printf("%saccount failure reason (Errors per Interval)=%d\n", var, failed_count); 
       } 
' 

pero esto simplemente se cuelga y no hace nada de salida. Alguien sugirió este pequeño cambio:

FILENAME="/var/log/file.log" 

awk -F , -v var="$HOSTNAME" ' 
       BEGIN { 
         failed_count=0; 
       } 
       /account failure reason/ { 
         failed_count++; 
       } 
       END { 
         printf("%saccount failure reason (Errors per Interval)=%d\n", var, failed_count); 
       } 
' <(tail -f $FILENAME) 

pero eso hace lo mismo.

El awk que estoy usando (He simplificado en el código anterior) funciona, como se usa en el guión existente donde los resultados de grep "^ $ TIMESTAMP" se canalizan en ella.

Mi pregunta es, ¿cómo se puede hacer funcionar el tail -f con awk?

+4

Cuando 'tail -f', su script awk nunca llega a un FINAL. Así que sigues contando errores, pero nunca imprimes nada. Necesita otra condición (por ejemplo, detectar que es un nuevo día) que ejecuta su printf y restablece el contador.Muéstranos una muestra de tu registro, y podemos sugerir una solución. – ghoti

Respuesta

4

Asumiendo que su registro se ve algo como esto:

Jul 13 06:43:18 foo account failure reason: unknown 
│ │  
│ └── $2 in awk 
└────── $1 in awk 

se podría hacer algo como esto:

FILENAME="/var/log/file.log" 

tail -F $FILENAME | awk -v hostname="$HOSTNAME" ' 
    NR == 1 { 
     last=$1 " " $2; 
    } 
    $1 " " $2 != last { 
     printf("%s account failure reason (Errors on %s)=%d\n", hostname, last, failed); 
     last=$1 " " $2; 
     failed=0; 
    } 
    /account failure reason/ { 
     failed++; 
    } 
' 

Tenga en cuenta que he cambiado a este tail -F (F mayúscula), ya que se encarga de registro envejecimiento. Esto no es compatible con todos los sistemas operativos, pero debería funcionar en BSD y Linuces modernos.

¿Cómo funciona?

Las secuencias de comandos Awk consisten en conjuntos de test { commands; } evaluados en cada línea de entrada. (Hay dos pruebas especiales, BEGIN y END cuyos comandos se ejecutan cuando awk se inicia y cuando awk extremos, respectivamente. En su pregunta, awk nunca se terminó, por lo que el código de END fue nunca se quede.)

El script de arriba tiene tres de secciones de prueba/comando:

  • En la primera, NR == 1 es una prueba que evalúa la verdad solo en la primera línea de entrada. El comando que ejecuta crea el valor inicial para la variable last, que se utiliza en la siguiente sección.
  • En la segunda sección, probamos si la "última" variable ha cambiado desde la última línea que se evaluó. Si esto es cierto, indica que estamos evaluando los datos de un nuevo día. Ahora es el momento de imprimir un resumen (registro) del mes pasado, restablecer nuestras variables y seguir adelante.
  • En el tercero, si la línea que estamos evaluando coincide con la expresión regular /account failure reason/, incrementamos nuestro contador.

Clear as mud? :-)

+0

+1 - Para hacer errores/día, necesita contar los días y hacer la división. O puede cambiar su fraseología a "Errores ayer" y restablecer 'failed_count'. –

+0

¡Ooh, punto! No tengo idea de lo que está haciendo, pero bueno, ¡gracias! – mazz0

+0

@DennisWilliamson - a la derecha, gracias por señalar eso. He actualizado la respuesta para que el código proporcione resultados más claros. – ghoti

Cuestiones relacionadas