Formas de analizar archivos de registro basados ​​en NCSA combinados

Formas de analizar archivos de registro basados ​​en NCSA combinados

He site:buscado un poco con Google en Server Fault, Super User y Stack Overflow. También verifiqué resultados no específicos del sitio y realmente no vi una pregunta como esta, así que aquí va...

yo lo detectéesta pregunta, relacionada con grep y awkque tiene un gran conocimiento, pero no creo que se haya abordado el desafío de calificación del texto. Esta pregunta también amplía el alcance a cualquier plataforma y cualquier programa.

Tengo registros de Squid o Apache basados ​​en el formato combinado NCSA. Cuando digo basado, es decir, las primeras n columnas del archivo cumplen con los estándares combinados de NCSA, puede haber más columnas con elementos personalizados.

Aquí hay una línea de ejemplo de un registro combinado de calamar:

1.1.1.1 - - [11/Dec/2010:03:41:46 -0500] "GET http://yourdomain.com:8080/en/some-page.html HTTP/1.1" 200 2142 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; C) AppleWebKit/532.4 (KHTML, like Gecko)" TCP_MEM_HIT:NONE

Me gustaría poder analizar nregistros y generar columnas específicas, para ordenar, contar, encontrar valores únicos, etc.

El principal desafío y lo que lo hace un poco complicado y también la razón por la que siento que esta pregunta aún no ha sido formulada ni respondida, es laenigma de calificación de texto.

cuando viasqlA partir de la pregunta grep/awk, estaba muy emocionado, pero luego me di cuenta de que no admitía la combinación lista para usar, algo que consideraré extender, supongo.

¡Espero recibir respuestas y aprender cosas nuevas! Las respuestas no tienen por qué limitarse a la plataforma o al programa/idioma. Para el contexto de esta pregunta, las plataformas que uso más son Linux u OSX.

Salud

Respuesta1

Usando Perl, probado en v5.10.0 creado para darwin-thread-multi-2level (OSX)

Para imprimir la columna UserAgent:

perl -n -e '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"/; print "$11\n"' -- test.log
  • opción -nmientras cada línea entest.log
  • opción -eprograma de una línea

Robé y modifiqué la perla que busqué en Google.del libro de cocina de PHP. Eliminé el $del final del re para admitir formatos personalizados basados ​​en NCSA combinados. El patrón se puede ampliar fácilmente para proporcionar más grupos.

Los grupos de expresiones regulares ()terminan como variables locales $1para$n

Rápido, sucio y muy fácil de extender y escribir.

Algunos ejemplos de canalización de la salida:

  • | sort | uniqvalores de columna únicos
  • | sort | uniq | wc -lrecuento de columnas único

Se aceptan críticas y mejoras.

Respuesta2

Aunque no aborda directamente la calificación del texto, un factor que se puede aprovechar en el formato combinado es que las columnas restantes delimitadas por espacios están consistentemente en la misma columna. Por lo tanto, puede solucionar el problema utilizando un bucle con printf y NF (número de columnas).

Según awk, $0 es la línea de entrada completa, $1 es la primera columna, $2 es la segunda y $NF es la última.

Entonces, para una NCSA estándar combinada, el agente de usuario es desde las columnas $13 hasta la columna $NF

Necesitaba eliminar la primera columna e intercambiarla con la última columna de un formato de registro modificado (la IP proxy se agregó a la última columna).

Entonces, lo que se debería devolver era la columna $NF, seguida de la segunda columna ($2) y luego las columnas restantes hasta NF - 1.

Pude hacer eso con lo siguiente: -

awk '{ printf "%s ", $NF; for (i=2; i<=NF-1; i++) printf "%s ", $i; printf "\n";}' < /var/log/nginx/access.log

información relacionada