Automatización de análisis de logs con Python
Descubre como realizar el análisis de log sin usar ninguna herramienta de pago mediante un script de Python que te categoriza las peticiones del servidor en función del código de respuesta.
¡Gracias por leer la newsletter de Linking and Growing! Damos la bienvenida a los nuevos suscriptores de esta semana.
Si deseas recibir cada semana información sobre SEO relacionada con linkbuilding, suscríbete a continuación.
¿Te tienes que pelear con el análisis de logs en tus proyectos SEO? Identificar errores o como se comportan los crawlers en nuestro sitio Web es fundamental cuando tenemos proyectos con miles de URLs.
Para ello, he creado un script en Python que usando el fichero de logs que te descargas de tu servidor, te va a permitir categorizar las peticiones que se realizan a tu sitio Web en función del código de respuesta.
De esta forma, vas a poder identificar errores o analizar como se comportan los distintos User agent al rastrear tu sitio Web.
Antes de compartirte el código, solo te pediré que te suscribas a la newsletter para apoyar los contenidos que comparto de manera totalmente gratuita. Y si conoces a alguien que le pueda interesar estos contenidos, lo compartas para llegar a más gente.
Dicho esto, aquí te comparto el script en Python para que puedas usarlo en tus proyectos SEO. Algunas de las consideraciones que tienes que tener en cuenta antes de ejecutar el código son las siguientes:
Debes crearte un archivo .xlsx con tantas pestañas como códigos de respuesta quieras analizar.
Dentro de cada pestaña debes añadir una primera fila como encabezado, que debe contener los siguientes campos: IP, date, protocol, response code y user agent.
En el código que te comparto, los códigos de respuesta que se analizan son los más habituales: 200, 301, 302, 400, 401, 404, 500 y 502. Si quieres añadir más códigos de respuesta, deberás añadirlos en el código.
Al extraer los datos del fichero de logs, deberás revisar el formato que te devuelve tu servidor y ajustar el código en función de tus datos.
import csv
import openpyxl
#Variables para almacenar número de códigos de respuesta por tipo
code_200=1
code_301=1
code_302=1
code_400=1
code_401=1
code_404=1
code_500=1
code_502=1
#Variables longitud fichero logs
min_logs=1
fich=open("C:\\Users\\rafavillaplana\\Downloads\\log_analysis\\access_ssl.log","r")
max_logs=len(fich.readlines())
fich.close()
#Abrimos fichero de logs para su lectura
fich=open("C:\\Users\\rafavillaplana\\Downloads\\log_analysis\\access_ssl.log","r")
myread=csv.reader(fich,delimiter='\n')
#Abrir excel categorizar códigos de respuesta
path = 'C:\\Users\\rafavillaplana\\Downloads\\log_analysis\\log_analysis.xlsx'
wb = openpyxl.load_workbook(filename = path)
for line in myread:
line_split=line[0].split(" ")
#Extraer los datos de cada petición al servidor
try:
ip=line_split[0]
date=line_split[3] + ']'
protocol=line_split[5]+' '+line_split[6] + '"'
response_code=line_split[8]
user_agent=line_split[11]+' '+line_split[12]+' '+line_split[13]+' '+line_split[14]+' '+line_split[15]+' '+line_split[16]+' '+line_split[17]+' '+line_split[18]
except:
ip=line_split[0]
date=line_split[3] + ']'
protocol=line_split[5]+' '+line_split[6] + '"'
response_code=line_split[8]
user_agent=line_split[11]
#Categorizar las peticiones al servidor según su código de respuesta
if response_code == "200":
code_200+=1
sheet_ranges = wb["Code_200"]
sheet_ranges.cell(row=code_200, column=1, value=ip)
sheet_ranges.cell(row=code_200, column=2, value=date)
sheet_ranges.cell(row=code_200, column=3, value=protocol)
sheet_ranges.cell(row=code_200, column=4, value=response_code)
sheet_ranges.cell(row=code_200, column=5, value=user_agent)
elif response_code == "301":
code_301+=1
sheet_ranges = wb["Code_301"]
sheet_ranges.cell(row=code_301, column=1, value=ip)
sheet_ranges.cell(row=code_301, column=2, value=date)
sheet_ranges.cell(row=code_301, column=3, value=protocol)
sheet_ranges.cell(row=code_301, column=4, value=response_code)
sheet_ranges.cell(row=code_301, column=5, value=user_agent)
elif response_code == "302":
code_302+=1
sheet_ranges = wb["Code_302"]
sheet_ranges.cell(row=code_302, column=1, value=ip)
sheet_ranges.cell(row=code_302, column=2, value=date)
sheet_ranges.cell(row=code_302, column=3, value=protocol)
sheet_ranges.cell(row=code_302, column=4, value=response_code)
sheet_ranges.cell(row=code_302, column=5, value=user_agent)
elif response_code == "400":
code_400+=1
sheet_ranges = wb["Code_400"]
sheet_ranges.cell(row=code_400, column=1, value=ip)
sheet_ranges.cell(row=code_400, column=2, value=date)
sheet_ranges.cell(row=code_400, column=3, value=protocol)
sheet_ranges.cell(row=code_400, column=4, value=response_code)
sheet_ranges.cell(row=code_400, column=5, value=user_agent)
elif response_code == "401":
code_401+=1
sheet_ranges = wb["Code_401"]
sheet_ranges.cell(row=code_401, column=1, value=ip)
sheet_ranges.cell(row=code_401, column=2, value=date)
sheet_ranges.cell(row=code_401, column=3, value=protocol)
sheet_ranges.cell(row=code_401, column=4, value=response_code)
sheet_ranges.cell(row=code_401, column=5, value=user_agent)
elif response_code == "404":
code_404+=1
sheet_ranges = wb["Code_404"]
sheet_ranges.cell(row=code_404, column=1, value=ip)
sheet_ranges.cell(row=code_404, column=2, value=date)
sheet_ranges.cell(row=code_404, column=3, value=protocol)
sheet_ranges.cell(row=code_404, column=4, value=response_code)
sheet_ranges.cell(row=code_404, column=5, value=user_agent)
elif response_code == "500":
code_500+=1
sheet_ranges = wb["Code_500"]
sheet_ranges.cell(row=code_500, column=1, value=ip)
sheet_ranges.cell(row=code_500, column=2, value=date)
sheet_ranges.cell(row=code_500, column=3, value=protocol)
sheet_ranges.cell(row=code_500, column=4, value=response_code)
sheet_ranges.cell(row=code_500, column=5, value=user_agent)
elif response_code == "502":
code_502+=1
sheet_ranges = wb["Code_502"]
sheet_ranges.cell(row=code_502, column=1, value=ip)
sheet_ranges.cell(row=code_502, column=2, value=date)
sheet_ranges.cell(row=code_502, column=3, value=protocol)
sheet_ranges.cell(row=code_502, column=4, value=response_code)
sheet_ranges.cell(row=code_502, column=5, value=user_agent)
print('Analizando' +' '+ str(min_logs) +' '+ 'de' +' '+ str(max_logs) +' '+ 'logs')
min_logs+=1
#Guardar en el excel al terminar de leer el archivo de los log
wb.save(path)
fich.close()
Si tienes alguna sugerencia de mejora para el código, déjame un comentario e iré subiendo revisiones.