Necesitaba saber cuál era la mejor hora para correr un script de mantenimiento en un servidor Web, y se me ocurrió desarrollar un script Bash que muestre una estadística de accesos por hora a partir de los archivos de log de Apache.

Lo que me interesaba era conocer con exactitud la cantidad de accesos para cada hora según la información que se encuentra en los archivos de log de Apache (access_log y error_log). No me interesaban los días (ya que la tarea de mantenimiento necesitaba ejecutarla todos los días) y necesitaba leer de varios archivos de log simultáneamente, para tener datos fidedignos.

Se trataba de una tarea simple, que seguramente implementen muchísimas herramientas diferentes. Pero no tenía tiempo para ponerme a instalar y testear una aplicación, y mucho menos para esperar que se llene una base de datos de accesos. Tenía que ser sí o sí a partir de los archivos de log ya existentes. Por esta razón, la solución más rápida para mi fue escribir un pequeño script Bash, el cual comparto en este artículo.



El script se encuentra documentado con comentarios. Su funcionamiento es bastante simple: para cada línea de archivo de log de Apache obtiene la hora, la cual se encuentra encerrada entre corchetes, y contabiliza la cantidad de accesos para cada hora utilizando un arreglo. Luego imprime los resultados.

Para que el script funcione correctamente, los archivos de log deben tener el formato NCSA Common Log File Format, el cual utiliza Apache por defecto.

El contenido del script es el siguiente, el cual decidí nombrar apache_access_stats.sh:

#!/bin/bash

# apache_access_stats.sh
#
#     Muestra un gráfico de accesos por hora a un servidor Apache a partir de un archivo
#     de log de accesos
#

mensaje="Muestra un gráfico de accesos por hora a un servidor Apache a partir de un archivo de log de
accesos."

# Variables
ancho=50

if [ $# -lt 1 ]
then
        printf "Uso: $0 ARCHIVO\n$mensaje\n"
        exit 1
fi

# Defino un arreglo de horas desde 0 a 23
hs=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

# Contabilizo la cantidad de accesos por cada hora
for h in $(cat $* | cut -d '[' -f2 | cut -d "]" -f1 | cut -d ' ' -f1 | cut -d ':' -f2 | sed 's/^0//')
do
        (( hs[$h]++ ))
done

# Calculo la máxima cantidad de accesos
max=0
for h2 in ${hs[@]}
do
        if [ "$h2" -gt "$max" ]
        then
                max=$h2
        fi
done

# Calculo la longitud de caracteres del máximo
longitud=${#max}

# Imprimo el gráfico
echo "HORA (ACCESOS)"
hora="0"
for h3 in ${hs[@]}
do
        # Para cada hora
        # Calculo la cantidad de numerales a imprimir
        c=$(( h3 * ancho / max ))

        # Imprimo la hora con formato "HH:MM"
        if [ $hora == "0" ]
        then
                printf " 0"
        else
                printf "%2.i" "$hora"
        fi
        printf ":00"

        # Imprimo la cantidad de accesos
        printf " (%$longitud.i) " "$h3"

        # Imprimo los numerales
        for (( i=0; i<$c; i++ ))
        do
                printf "#"
        done
        echo

        # Siguiente hora
        (( hora++ ))
done

 

Luego de crear el script, es necesario otorgarle permisos de ejecución:

[root@www ~]# chmod +x apache_access_stats.sh

Al ejecutarlo sin parámetros, el script imprime una breve ayuda en español:

[root@www ~]# ./apache_access_stats.sh
Uso: ./apache_access_stats.sh ARCHIVO
Muestra un gráfico de accesos por hora a un servidor Apache a partir de un archivo de log de
accesos.

El script requiere uno o más archivos de log pasados como parámetro, para poder analizar y elaborar la estadística. Es posible utilizar comodines (wildcards).

Ejemplo de uso:

[root@www ~]# ./apache_access_stats.sh /var/log/httpd/ssl_access_log*
HORA (ACCESOS)
 0:00 ( 1177) ##
 1:00 (  489) #
 2:00 (  123) 
 3:00 (  124) 
 4:00 (  390) 
 5:00 (  507) #
 6:00 (  450) 
 7:00 ( 1478) ###
 8:00 ( 7091) ###############
 9:00 (15747) #################################
10:00 (16656) ###################################
11:00 (23344) ##################################################
12:00 (19536) #########################################
13:00 (13448) ############################
14:00 (19418) #########################################
15:00 (14495) ###############################
16:00 (12869) ###########################
17:00 ( 8770) ##################
18:00 ( 7601) ################
19:00 ( 5183) ###########
20:00 ( 4267) #########
21:00 ( 2726) #####
22:00 ( 2451) #####
23:00 ( 3764) ########

Gracias a este script pude determinar que la mejor hora para ejecutar la nueva tarea de mantenimiento sobre el servidor es entre las 2 y las 3 de la mañana.

¡Espero que les haya gustado!


Tal vez pueda interesarte


Compartí este artículo