Con el fin de publicar métricas en AWS CloudWatch, me gustaría obtener información sobre la cantidad de ocurrencias de alguna palabra clave (por ejemplo, error, excepción) en el último minuto (desde la hora actual del sistema) en los registros de mi aplicación.
Los siguientes son los comandos que he probado hasta ahora en función de las respuestas de un hilo relacionado ( filtrar las entradas del archivo de registro según el rango de fechas ):
awk -vDate=`date -d'now-1 minutes' +["%Y-%m-%d %H:%M:%S"` '($1 FS $2) > Date {print $3}' application.log | grep "ERROR" | uniq -c awk -vDate=`date -d'now-1 minutes' +["%Y-%m-%d %H:%M:%S"` '{if ($1 > Date) {print $3}}' application.log | grep "ERROR" | uniq -c awk -vDate=`date -d'now-1 minutes' +["%Y-%m-%d %H:%M:%S"` '{if ($1 == $Date) {print $3}}' application.log | grep "ERROR" | uniq -cPero recibo un error como este cuando intento esto:
awk: cmd. line:1: 13:06:17 awk: cmd. line:1: ^ syntax errorEl siguiente es el formato de mi archivo de registro:
2016-02-05 12:10:48,761 [INFO] from org.xxx 2016-02-05 12:10:48,761 [INFO] from org.xxx 2016-02-05 12:10:48,763 [INFO] from org.xxx 2016-02-05 12:10:48,763 [INFO] from org.xxx 2016-02-05 12:10:48,763 [ERROR] from org.xxx 2016-02-05 12:10:48,763 [INFO] from org.xxx 2016-02-05 12:10:48,764 [INFO] ffrom org.xxx 2016-02-05 12:10:48,773 [WARN] from org.xxx 2016-02-05 12:10:48,777 [INFO] from org.xxx 2016-02-05 12:10:48,778 [INFO] from org.xxxAtrapado en esto durante bastante tiempo. ¡Gracias por la ayuda!
Está utilizando acentos graves obsoletos y, por lo tanto, no cita la date de salida. Haz esto en su lugar:
awk -vDate="$(date -d'now-1 minutes' +"%Y-%m-%d %H:%M:%S")" '($1 FS $2) > Date { if ($3~/ERROR/) print $3}' file Tenga en cuenta que no necesita canalizar a grep y al no tener un espacio entre -v y Date , su secuencia de comandos es específica de gawk y si es específica de gawk, entonces no necesita esa llamada externa hasta la date ya que gawk tiene su propio funciones de tiempo integradas (pista: BEGIN{Date=strftime("%Y-%m-%d %H:%M:%S",systime()-60)} ).
Tampoco necesita uniq -c pero sin ver su entrada real y la salida esperada (haciendo un uniq -c dado que la entrada no tendría ningún sentido frente a wc -l ) no voy a adivinar más.
Oh, qué diablos, aquí está todo el guión en Gawk:
$ cat tst.awk BEGIN { #date = strftime("%Y-%m-%d %H:%M:%S",systime()-60) date = "2016-02-05 12:10:48" } ($1" "$2) > date { if ($3 ~ /ERROR/) { cnt[$3]++ } } END { for (err in cnt) { print err, cnt[err] } } $ $ awk -f tst.awk file [ERROR] 1 Supongo que en realidad tienes varios sabores de "ERROR" y es por eso que quieres el recuento de cada uno. Simplemente elimine el comentario de la línea strftime y elimine la línea de marca de tiempo codificada para que se ejecute en sus datos reales.