Puedo usar analizadores de registros, pero a menudo necesito analizar registros web recientes para ver qué está sucediendo en este momento.
A veces hago cosas como averiguar los 10 mejores ips que solicitan un determinado archivo
cat foo.log | grep request_to_file_foo | awk '{print $1}' | sort -n | uniq -c | sort -rn | head
¿Qué tienes en tu caja de herramientas?
Respuestas:
Puede hacer casi cualquier cosa con los archivos de registro de apache con awk solo. Los archivos de registro de Apache están básicamente separados por espacios en blanco, y puede pretender que las comillas no existen y acceder a cualquier información que le interese por número de columna. El único momento en que esto se descompone es si tiene el formato de registro combinado y está interesado en agentes de usuario, momento en el que debe usar comillas (") como separador y ejecutar un comando awk separado. A continuación se muestran las IP de cada usuario que solicita la página de índice ordenada por el número de visitas:
$ 7 es la url solicitada. Puede agregar las condiciones que desee al principio. Reemplace el '$ 7 == "/" con la información que desee.
Si reemplaza $ 1 en (ipcount [$ 1] ++), puede agrupar los resultados por otros criterios. El uso de $ 7 mostraría a qué páginas se accedió y con qué frecuencia. Por supuesto, entonces querrás cambiar la condición al principio. A continuación se mostrará a qué páginas accedió un usuario desde una IP específica:
También puede canalizar la salida a través de ordenar para obtener los resultados en orden, ya sea como parte del comando de shell, o también en el script awk mismo:
Esto último sería útil si decidiera expandir el script awk para imprimir otra información. Todo es cuestión de lo que quieras descubrir. Estos deberían servir como punto de partida para lo que sea que le interese.
fuente
Una cosa que nunca he visto hacer a nadie más, por razones que no puedo imaginar, es cambiar el formato del archivo de registro de Apache a una versión más fácil de analizar con la información que realmente le importa.
Por ejemplo, nunca usamos autenticación básica HTTP, por lo que no necesitamos registrar esos campos. Yo estoy interesado en cuánto tiempo toma cada solicitud para servir, por lo que añadir que en. Para un proyecto, también queremos saber (en nuestro equilibrador de carga) si los servidores están sirviendo peticiones más lento que otros, así que registrar el nombre del servidor al que regresamos.
Aquí hay un extracto de la configuración de apache de un servidor:
Lo que realmente no puede deducir de esto es que entre cada campo hay un carácter de tabulación literal (\ t). Esto significa que si quiero hacer un análisis en Python, tal vez mostrar estados que no sean 200, por ejemplo, puedo hacer esto:
O si quisiera hacer '¿quién está conectando imágenes?' podría ser
Para los recuentos de IP en un registro de acceso, el ejemplo anterior:
se convierte en algo como esto:
Más fácil de leer y comprender, y mucho menos costoso desde el punto de vista computacional (sin expresiones regulares), lo que, en registros de 9 GB, hace una gran diferencia en cuánto tiempo lleva. Cuando esto se pone REALMENTE ordenado es si quieres hacer lo mismo para los agentes de usuario. Si sus registros están delimitados por espacios, debe hacer algunas coincidencias de expresiones regulares o buscar cadenas a mano. Con este formato, es simple:
Exactamente igual que el anterior. De hecho, cualquier resumen que desee hacer es esencialmente el mismo.
¿Por qué demonios gastaría la CPU de mi sistema en awk y grep cuando el corte haga exactamente lo que quiero órdenes de magnitud más rápido?
fuente
cut -f 3 log | uniq -c | sort -n
agentes de usuariocut -f 8 log | uniq -c | sort -n
.Olvídate de awk y grep. Echa un vistazo a asql . ¿Por qué escribir scripts ilegibles cuando puede usar la sintaxis tipo sql para consultar el archivo de registro? P.ej.
fuente
Aquí hay una secuencia de comandos para encontrar las URL principales, los principales referentes y los mejores agentes de uso de las entradas de registro N
Fuente
fuente
para los recuentos de IP en un registro de acceso:
Es un poco feo, pero funciona. También uso lo siguiente con netstat (para ver las conexiones activas):
Son algunos de mis favoritos "one liners" :)
fuente
Crear una lista de preguntas comunes sería un gran índice para estas respuestas a esta pregunta. Mis preguntas comunes son:
Noto tales cambios al monitorear las páginas de estado del servidor (a través de mod_status) para obtener una tasa de hit y un tiempo de respuesta aproximado para solicitudes activas y recientemente completadas (sabiendo muy bien que extraño una gran cantidad de datos, pero las muestras son lo suficientemente buenas).
Uso la siguiente directiva LogFormat (% T es realmente útil)
Estoy buscando causa-efecto y lo que sucedió primero ... generalmente sobre subconjuntos específicos de patrones en mis registros, por lo que necesito saber lo siguiente para cualquier patrón / expresión regular dada:
Generalmente uso perl, porque eventualmente se vuelve lo suficientemente complejo como para que valga la pena.
Un ejemplo que no es Perl sería una tasa de éxito rápida por minuto para códigos de estado que no sean 200:
Sí, estoy haciendo trampa con ese grep, suponiendo que un espacio de cita-espacio-200 coincide solo con códigos de estado http ... podría usar awk o perl para aislar el campo, solo tenga en cuenta que podría ser inexacto.
Un ejemplo más complejo en perl podría ser visualizar un cambio en la tasa de aciertos para un patrón.
Hay mucho para masticar en el siguiente script, especialmente si no eres familiar con Perl.
código sigue:
Si solo desea procesar métricas estándar, finalice la compra
fuente
Aquí mi ejemplo 'sed', lee el formato predeterminado de los registros de apache y lo convierte en algo más conveniente para el procesamiento automático. Toda la línea se define como expresión regular, las variables se guardan y se escriben en la salida con '#' como separador.
La notación simplificada de la entrada es:% s% s% s [% s] "% s"% s% s "% s" "% s"
Ejemplo de línea de entrada: xx.xx.xx.xx - - [29 / Mar / 2011: 12: 33: 02 +0200] "GET /index.html HTTP / 1.0" 200 9443 "-" "Mozilla / 4.0"
Ejemplo de línea de salida: xx.xx.xx.xx # - # - # 29 / Mar / 2011: 12: 33: 02 + 0200 # GET /index.html HTTP / 1.0 # 200 # 9443 # - # Mozilla / 4.0
Siente el poder de las expresiones regulares :-)
fuente
Utilizo mucho awk siguiendo o capturando el archivo. Cada noche me entrego un informe web para cada servidor. Dependiendo de su archivo de registro y su LogFormat, necesitará editar algunos de los revestimientos para que funcionen para usted.
Aquí hay un ejemplo simple:
Si quiero seguir los registros en mi servidor por solo códigos de estado 404/500, haría esto:
<recorte>
</ snip>
fuente
Quién está conectando en caliente tus imágenes:
fuente
Lo que suelo hacer la mayor parte del tiempo es leer secciones de un registro en función del tiempo, así que escribí el siguiente script usando sed para extraer el período que me interesa, funciona en cada archivo de registro que he encontrado a través y puede manejar los registros archivados también.
fuente
Si bien no es sed o awk, hay dos cosas que he encontrado útiles para manejar archivos de registro de apache y icecast.
AWStats tiene una secuencia de comandos muy útil llamada logresolvemerge.pl que combinará múltiples archivos de registro comprimidos o sin comprimir, duplicados y los clasificará por marca de tiempo. También puede realizar búsquedas de DNS y configurarse para ejecutar multiproceso. Es particularmente útil cuando se usa con awstats porque awstats no puede agregar líneas de registro con marcas de tiempo más antiguas que la base de datos actual, por lo que todo debe agregarse en orden, pero eso es muy fácil ya que simplemente arroja todo en logresolvemerge.pl y todo sale bien.
sed y awk son bastante malos en el manejo de fechas porque generalmente los tratan como cadenas. awk tiene algunas funciones de hora y fecha, pero no son suficientes. Por ejemplo, extraer un rango de líneas entre dos marcas de tiempo es difícil si esas marcas de tiempo exactas no aparecen en el archivo (incluso si los valores entre ellas sí lo hacen): el ejemplo de Chris tiene exactamente este problema. Para lidiar con eso, escribí un script PHP que informa los rangos de marca de tiempo del archivo de registro y también puedo extraer un fragmento por rango de marca de tiempo, usando cualquier formato de fecha u hora que desee (no necesita coincidir con el formato de marca de tiempo del archivo de registro).
Para mantener este tema, aquí hay un par de funciones útiles: Obtenga el número total de bytes servidos desde el registro de apache o icecast:
Obtenga el número total de segundos conectados desde un registro de Icecast:
fuente
Al recuperar este viejo hilo, después de renunciar a asql para archivos de registro grandes, busqué una solución, también en serverfault, descubrí que wtop aquí es una herramienta de código abierto, que es capaz de hacer monitoreo en vivo o procesar registros y obtener estadísticas (arriba N), muy flexible y potente, el lugar oficial está aquí
fuente