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:
# We don't want to log bots, they're our friends
BrowserMatch Pingdom.com robot
# Custom log format, for testing
#
# date proto ipaddr status time req referer user-agent
LogFormat "%{%F %T}t %p %a %>s %D %r %{Referer}i %{User-agent}i" standard
CustomLog /var/log/apache2/access.log standard env=!robot
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:
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
O si quisiera hacer '¿quién está conectando imágenes?' podría ser
if line[6] in ("","-") and "/images" in line[5]:
Para los recuentos de IP en un registro de acceso, el ejemplo anterior:
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" logfile | sort -n | uniq -c | sort -n
se convierte en algo como esto:
cut -f 3 log | uniq -c | sort -n
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:
cut -f 8 log | uniq -c | sort -n
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?