Análisis de Apache Access Log para SEO con PHP y Google Data Studio

Hace pocos días os escribía este post sobre automatización de informes en Google Data Studio y a los pocos días de esto Iñaki Huerta escribía otro genial artículo de análisis de logs con Google Big Query y Google Data Studio. Después de leerlo me pareció que es bastante complicada el procesamiento del fichero access log con Big query, al menos me ha resultado bastante complicado a mí que nunca he utilizado la herramienta.

Como es fundamental para la mejora del rastreo en grandes sitios he buscado un sistema más amigable para mi y… ¿cómo ha sido? pues como todo lo que suelo hacer: programando.

Phaser PHP para Apache Access Log

Si nos vamos al formato oficial de Apache para el log de acceso nos encontramos con un formato de este tipo: “%h %l %u %t \”%r\” %>s %b” que puede ser reconocido fácilmente en PHP con la genial función Preg_Match como os dejo en el siguiente código PHP:

  1. function normalizar_fecha($fecha)
  2. {
  3. return (str_replace("Apr","04",$fecha));
  4. }
  5.  
  6. function log_to_csv ($log,$csv)
  7. {
  8. $file = fopen($log, "r");
  9. while(!feof($file))
  10. {
  11. $linea=fgets($file);
  12. if (strpos($linea,"Googlebot/2.1"))
  13. {
  14. preg_match("/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/", $linea, $matches);
  15. fwrite($csv,'"'.$matches[1].'",');
  16. fwrite($csv,'"'.normalizar_fecha($matches[4]).'",');
  17. fwrite($csv,'"'.$matches[7].'",');
  18. fwrite($csv,'"'.$matches[8].'",');
  19. fwrite($csv,'"'.$matches[9].'",');
  20. fwrite($csv,'"'.$matches[10].'",');
  21. fwrite($csv,'"'.$matches[11].'",');
  22. fwrite($csv,'"'.str_replace("\"","",$matches[12]).'",'.PHP_EOL);
  23. }
  24. }
  25. fclose($file);
  26. }
  27.  
  28. $csv = fopen("log.csv", "w");
  29. fwrite($csv,'"Remote Host","Fecha","Metodo","URI","HTTP","Estado","Size","Referer"'.PHP_EOL);
  30. log_to_csv("log",$csv);
  31. log_to_csv("log1",$csv);
  32. log_to_csv("log2",$csv);
  33. log_to_csv("log3",$csv);
  34. log_to_csv("log4",$csv);
  35. fclose($csv);

Ahora cuento a grandes rasgos lo que hace:

  1. En resumen toma un fichero de logs y lo convierte en CSV.
  2. Lo hace sólo con los accesos de Google Bot para ahorrar mucho pero que mucho tiempo y recursos.
  3. Tomo solo los campos:Remote Host, Fecha, Metodo, URI, HTTP, Estado, Size y Referer para aligerar el peso del CSV resultante, ya que lo subiré a GDrive para continuar el tratamiento.
  4. Como lo normal es que el log venga partido en múltiples ficheros habrá que hacer varias llamadas a la function log_to_csv para completar el proceso, en el ejemplo son 4 llamadas.
  5. Uso también una función para normalizar la fecha (está sólo para abril de momento) ya que esa columna es muy importante que llegue bien a Google Data Studio.

¿Qué hacemos con el CSV generado desde el log de Apache?

Una vez se genera un CSV similar a este:

Log to CSV

Lo usaremos como fuente de datos para Google data Studio, de forma similar a como lo explica Iñaki es su presentación. La fuente de datos al final queda así:

Dónde he generado los siguientes campos calculados:

  1. Clusters de URI (URI Nx) para ver que carpetas están recibiendo más hits.
  2. Cuenta de Hits.
  3. Cuenta de Hits únicos por URI
  4. Accesos a URI únicas.

Informe de Log SEO en Google Data Studio

Con esto ya podemos creer un informe similar a este:

informe de Logs en Data Studio

Lo primero que vemos es que el robot de Google se está volviendo loco entre 301, 410, 404 y perdiendo un montón de tiempo en el acceso a utilidades Ajax. Además tengo otras tres páginas a continuación donde se detallan los estados de error para que el programador pueda solucionarlos.

En fin ya puedo añadir a mis informes periódicos de clientes este de log que seguro que les va a venir muy bien y tú… ¿quieres que te haga uno para tu web? contacta ahora sin ningún compromiso.


Conoce mis servicios SEO.



Servicios personalizados para profesionales, agencias y PYMES

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *