Análisis de logs de servidor para SEO: guía completa
Cómo analizar los logs de rastreo, mantener el alcance del análisis y separar la actividad de los bots de cualquier conclusión sobre posiciones o tráfico al priorizar correcciones técnicas.
Por qué analizar los logs
Google Search Console solo muestra datos agregados, con un retraso de tres días. Screaming Frog simula un navegador, no a Googlebot. Los archivos de log del servidor web son la única fuente que registra cada petición real de un bot de búsqueda: la marca de tiempo exacta, la URL, el código de respuesta y la IP del rastreador.
El análisis de logs responde preguntas que no se resuelven de otra forma: qué páginas rastrea Googlebot cada hora y cuáles lleva meses sin visitar; dónde se encuentra con 404 y errores 500; si hay bucles de redirección infinitos; si el presupuesto se desperdicia en duplicados por parámetros o en páginas tras un inicio de sesión. Estos datos son justo lo que necesitas para tomar decisiones fundadas sobre la gestión del presupuesto de rastreo.
Qué aporta el análisis de logs
Peticiones reales
Cada petición HTTP de un rastreador queda registrada en el archivo de log: sin muestreo ni retrasos de agregación
Precisión temporal
Las marcas de tiempo con precisión de segundo permiten seguir los patrones de rastreo por día de la semana y hora del día
Bots en una sola fuente
Googlebot, Bingbot, Yandex y otros: todos los rastreadores en un único archivo, comparables en una sola vista
Retraso de datos
Los logs están disponibles al instante: no hay que esperar a un nuevo rastreo ni a que se actualice el informe de GSC
Cómo acceder a los logs
La ruta a tus logs depende del servidor web y del proveedor de hosting. En la mayoría de VPS y servidores dedicados se puede acceder a los logs directamente por SSH. Para el análisis necesitas, por lo general, los logs de acceso de los últimos 30–90 días: ese periodo es lo bastante largo para detectar patrones estacionales y, a la vez, mantiene los datos actualizados.
| Servidor / plataforma | Ruta de log por defecto | Notas |
|---|---|---|
| Nginx | /var/log/nginx/access.log | Rotación con logrotate. Archivos: access.log.1, access.log.2.gz, etc. |
| Apache | /var/log/apache2/access.log (Debian/Ubuntu) o /var/log/httpd/access_log (RHEL) | El formato puede ser CLF o Combined: revisa la directiva LogFormat |
| cPanel / WHM | ~/access-logs/<dominio> o Administrador de archivos → Logs | A menudo se separan por dominio. Raw Access está disponible en la interfaz de cPanel |
| Cloudflare Workers / Enterprise | Logpush API → S3, R2, GCS | Solo en el plan Enterprise. En Free/Pro, usa Workers Analytics Engine |
| AWS CloudFront | Bucket de S3 configurado en Distribution settings → Logging | Genera logs cada 5–10 minutos, comprimidos en gzip |
| Google Cloud / GCS | Cloud Logging → exportación a BigQuery o GCS | Ideal para grandes volúmenes: lanza consultas SQL directamente en BigQuery |
# Nginx: view the last 1000 lines of the access log
tail -n 1000 /var/log/nginx/access.log
# Size of the current log file
du -sh /var/log/nginx/access.log
# Decompress and merge rotated logs
zcat /var/log/nginx/access.log.*.gz | cat - /var/log/nginx/access.log > all_access.log
# Line count (≈ number of requests) in the merged file
wc -l all_access.logrotate 30 en /etc/logrotate.d/nginx con antelación: los logs borrados no se pueden recuperar.Estructura de un registro de log: formato CLF
La mayoría de servidores usan por defecto el Combined Log Format (CLF), una versión ampliada del Common Log Format. Estos son los campos que importan para el análisis SEO.
# Combined Log Format record (Nginx/Apache)
66.249.66.1 - - [19/May/2026:14:32:01 +0000] "GET /blog/seo-guide/ HTTP/1.1" 200 45231 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
│ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ └─ User-Agent
│ │ │ │ │ │ │ └───── Referer
│ │ │ │ │ │ └─────────── Bytes sent
│ │ │ │ │ └──────────────── HTTP status
│ │ │ │ └─────────────────────────────────────────── Request
│ │ │ └────────────────────────────────────────────────────────────────────────── Timestamp
│ │ └───────────────────────────────────────────────────────────────────────────── Auth user
│ └─────────────────────────────────────────────────────────────────────────────── Ident
└─────────────────────────────────────────────────────────────────────────────────────────── IP address| Campo | Relevancia para SEO | Qué buscar |
|---|---|---|
| Dirección IP | Alta | Rangos IP de Googlebot, Bingbot y Yandex: sirven para filtrar los rastreadores reales |
| Marca de tiempo | Alta | Frecuencia de rastreo y fecha de la última visita a URL concretas |
| Petición (método + URL) | Crítica | Qué URL se rastrean: páginas necesarias, duplicados, parámetros y rutas inexistentes |
| Código de estado HTTP | Crítica | 200 (correcto), 301/302 (redirecciones), 404 (enlaces rotos), 500 (errores del servidor) |
| Bytes enviados | Media | Un tamaño anormalmente pequeño es señal de una página vacía o de una respuesta incompleta |
| User-Agent | Crítica | Distinguir Googlebot de otros bots y de los usuarios reales |
Filtrado: aislar a los rastreadores
Los logs en bruto mezclan peticiones de usuarios, pings de monitorización, bots de spam y rastreadores de buscadores. Para el análisis SEO solo necesitas extraer los robots de búsqueda. El método más fiable es filtrar por la cadena User-Agent y luego verificar la IP mediante DNS.
# Extract all Googlebot requests
grep -i 'googlebot' /var/log/nginx/access.log > googlebot.log
# Extract all SEO crawlers
grep -iE '(googlebot|bingbot|yandex|ahrefsbot|semrushbot|mj12bot)' \
/var/log/nginx/access.log > all_bots.log
# Count requests by crawler
grep -oiE '(googlebot|bingbot|yandexbot|ahrefsbot|semrushbot)' \
/var/log/nginx/access.log | sort | uniq -c | sort -rn
# Verify IP via reverse DNS (confirm it's the real Googlebot)
host 66.249.66.1
# Should return: crawl-66-249-66-1.googlebot.com
# Then forward DNS:
host crawl-66-249-66-1.googlebot.com
# Should return the same IP — then it's a legitimate GooglebotGooglebot. Para un filtrado preciso, verifica las IP mediante DNS inverso: el Googlebot real se resuelve en *.googlebot.com. Google publica sus rangos IP oficiales a través de la Special IP Addresses API.Métricas SEO clave
Tras el filtrado, pasa al análisis. Estas son seis métricas que aportan más información con menos esfuerzo.
Cuántas veces visitó Googlebot una URL concreta durante el periodo. Las páginas con PageRank alto y actualizaciones frecuentes se rastrean con más frecuencia. Si una página importante se visitó una sola vez en 30 días, Google la considera de poco valor.
Objetivo: páginas clave, al menos una vez cada 3 díasProporción de respuestas 4xx y 5xx en las peticiones de Googlebot. Los 404 desperdician presupuesto de rastreo. Los 500 apuntan a problemas sistémicos. Una tasa alta de errores reduce la confianza de Google en el sitio.
Referencia: 4xx < 3 %, 5xx < 0,5 %Qué fracción de las peticiones de Googlebot termina en 301 o 302. Las redirecciones consumen presupuesto y ralentizan la reindexación. Las cadenas de redirección (A → B → C) son especialmente dañinas.
Referencia: 3xx < 10 % de todas las peticiones de botsEl mismo contenido bajo URL distintas: con y sin www, con y sin barra final, con parámetros UTM. Cada variante se rastrea por separado: una fuga directa del presupuesto de rastreo.
Objetivo: una única URL canónica por cada contenidoPáginas clave (categorías, landing pages, artículos nuevos) que Googlebot no pidió en 30 días. Esto apunta a problemas con el enlazado interno o a un bloqueo en robots.txt.
Objetivo: 0 páginas importantes sin rastreo en 30 díasPáginas que Google rastrea y no debería: paneles de administración, páginas de sesión, entornos de prueba, duplicados por parámetros. Desperdician presupuesto y a veces suponen un riesgo de seguridad.
Objetivo: 0 URL sensibles en los logs de GooglebotHerramientas de análisis
Tres herramientas cubren el 95 % de las tareas de análisis de logs: la línea de comandos para comprobaciones rápidas, una herramienta gráfica especializada para análisis en profundidad, y Python/BigQuery para grandes volúmenes de datos y automatización.
Bash: análisis rápido sin instalar nada
# Top 20 URLs Googlebot crawls most often
grep -i 'googlebot' access.log \
| awk '{print $7}' \
| sort | uniq -c | sort -rn | head -20
# Response status distribution for Googlebot
grep -i 'googlebot' access.log \
| awk '{print $9}' \
| sort | uniq -c | sort -rn
# URLs returning 404 to Googlebot
grep -i 'googlebot' access.log \
| awk '$9 == 404 {print $7}' \
| sort | uniq -c | sort -rn | head -50
# Googlebot request count by day
grep -i 'googlebot' access.log \
| awk '{print $4}' \
| cut -d: -f1 | tr -d '[' \
| sort | uniq -c
# Parametric URLs in Googlebot requests
grep -i 'googlebot' access.log \
| awk '{print $7}' \
| grep '?' \
| sort | uniq -c | sort -rn | head -30Screaming Frog Log File Analyser
Herramienta de pago ($259 al año), pero imprescindible para el análisis periódico. Carga el archivo de log, lo analiza y genera informes: segmentación bot frente a navegador, paneles de códigos de estado, mapas de calor del rastreo por directorio y una lista de páginas sin rastreo. Admite los formatos de Nginx, Apache, IIS, CloudFlare, Fastly y CSV personalizados.
Python: análisis flexible para archivos grandes
import re
from collections import Counter
LOG_PATTERN = re.compile(
r'(?P<ip>\S+) \S+ \S+ \[(?P<time>[^\]]+)\] '
r'"(?P<method>\S+) (?P<url>\S+) \S+" '
r'(?P<status>\d{3}) (?P<size>\S+) '
r'"(?P<referer>[^"]*)" "(?P<ua>[^"]*)')
def parse_log(path: str, bot_pattern: str = 'googlebot') -> list[dict]:
entries = []
with open(path) as f:
for line in f:
m = LOG_PATTERN.match(line)
if not m:
continue
if bot_pattern.lower() not in m.group('ua').lower():
continue
entries.append({
'ip': m.group('ip'),
'url': m.group('url'),
'status': int(m.group('status')),
'ua': m.group('ua'),
})
return entries
entries = parse_log('access.log')
# Top 20 URLs by crawl frequency
url_counts = Counter(e['url'] for e in entries)
for url, count in url_counts.most_common(20):
print(f'{count:>6} {url}')
# 404 errors
errors = [e['url'] for e in entries if e['status'] == 404]
for url, count in Counter(errors).most_common(20):
print(f'{count:>6} 404 {url}')Patrones de rastreo: qué buscar
Las métricas en bruto no dicen nada sin interpretarlas. Estos son los patrones concretos que conviene buscar en los logs de Googlebot.
Patrón 1: rastreadas pero no indexadas
Googlebot visita una página con regularidad, pero nunca aparece como «Indexada» en GSC. Causas: una etiqueta meta noindex, un bloqueo mediante X-Robots-Tag en las cabeceras HTTP, contenido pobre, o una etiqueta canonical que apunta a otra página. Compara la lista de URL rastreadas con regularidad con las páginas indexadas obtenidas de la API de GSC: las discrepancias señalan las páginas problemáticas.
Patrón 2: tormentas de rastreo
Un pico repentino de peticiones de Googlebot en una ventana corta suele indicar URL generadas de forma infinita: facetas, URL de paginación con parámetros, tokens de sesión en la URL. Una tormenta de rastreo puede agotar todo el presupuesto en horas y suponer una carga real para el servidor. Representa las peticiones como un histograma por hora: los picos anormales se ven al instante.
Patrón 3: páginas nuevas ignoradas
Hace tres semanas se creó una página nueva y se añadió al sitemap, pero Googlebot no registra ninguna petición en los logs. Causas: no hay enlaces internos a la página, el bot no está volviendo a rastrear el sitemap, o la página está a un nivel de anidamiento demasiado profundo. Comprueba las URL nuevas con la herramienta de inspección de URL de GSC y busca la fecha de la primera aparición en los logs.
Patrón 4: recursos que bloquean el renderizado
Googlebot pide no solo páginas HTML, sino también CSS, JS e imágenes. Si los recursos críticos están bloqueados en robots.txt, el bot no puede renderizar la página y puede infravalorarla. Comprueba en los logs qué porcentaje de las peticiones de Googlebot apunta a recursos estáticos y si algún archivo JS necesario está bloqueado.
Problemas habituales y soluciones
| Problema en los logs | Causa raíz | Solución |
|---|---|---|
| Muchos 404 de Googlebot | Páginas eliminadas que aún tienen enlaces externos o internos apuntando a ellas | 301 a la página activa más cercana + eliminar los enlaces internos rotos |
| URL con parámetros en el rastreo | Etiquetas UTM, ordenaciones y sesiones sin bloquear en robots.txt | Disallow en robots.txt + canonical a la URL limpia en las propias páginas |
| Cadenas de redirecciones (A→B→C) | Redirecciones acumuladas tras una reestructuración | Reducir a un solo salto y actualizar todos los enlaces salientes |
| Páginas /admin y /staging en los logs | Secciones de servicio sin bloquear | Disallow /admin/ en robots.txt + autenticación HTTP en staging |
| Respuestas 5xx a Googlebot | Sobrecarga del servidor en picos de tráfico o errores del backend | Optimizar el TTFB, añadir caché y configurar un límite de frecuencia de rastreo |
| Página importante sin rastrear | Sin enlaces internos, demasiado profunda en la jerarquía, fuera del sitemap | Añadir al sitemap + enlaces internos desde las páginas clave |
| Duplicados www / sin www | No hay una redirección 301 configurada a la versión canónica del dominio | 301 de sin www a www (o al revés) a nivel de nginx/Apache |
| robots.txt bloquea JS/CSS necesarios | Disallow /assets/ o /static/ en la plantilla | Quitar el bloqueo de los recursos críticos para el renderizado |
# Detect redirect chains in logs
# Step 1: extract all URLs with 301/302 status for Googlebot
grep -i 'googlebot' access.log \
| awk '$9 ~ /^30[12]$/ {print $7}' | sort -u > redirects.txt
# Step 2: check if any of those URLs are also redirect sources
while read url; do
if grep -q "GET $url " redirects.txt 2>/dev/null; then
echo "CHAIN: $url"
fi
done < redirects.txt
# Find 5xx errors grouped by URL and hour
grep -i 'googlebot' access.log \
| awk '$9 ~ /^5/ {print $4" "$7}' \
| cut -d: -f1-2 \
| sort | uniq -c | sort -rn | head -20Preguntas frecuentes
Conclusión
El análisis de logs es la auditoría SEO más honesta que existe. GSC muestra agregados, Screaming Frog simula un rastreo, pero los logs registran cada decisión real que toma Googlebot. El proceso es sencillo: obtén logs de 30–90 días → filtra los rastreadores por User-Agent con verificación DNS → calcula las seis métricas clave → cruza los datos con el índice de GSC → corrige las discrepancias.
Empieza con tres comandos de Bash: las 20 URL más rastreadas, la distribución de códigos de estado y los 404 más frecuentes. En una hora tendrás una lista concreta de acciones: redirecciones que configurar, URL que bloquear en robots.txt y páginas que añadir al sitemap. Es más rápido y barato que cualquier auditoría de pago: los datos ya están en tu servidor.
¿Con qué frecuencia debo analizar los logs?
¿Necesito logs si mi sitio es pequeño (menos de 500 páginas)?
¿Cómo distingo el Googlebot real de un suplantador?
¿La frecuencia de rastreo afecta directamente a las posiciones?
¿Qué hago si Googlebot rastrea demasiado agresivamente y sobrecarga el servidor?
Check it with SpiderHead
Free and local: run the audit on your own machine.



