Analisi dei log del server per la SEO: guida completa
I log del server sono l'unica fonte di verità su come i bot vedono il sito: pipeline completa, dai log alle azioni su robots.txt e sitemap.
Perché analizzare i file di log
Google Search Console mostra solo dati aggregati con tre giorni di ritardo. Screaming Frog simula un browser, non Googlebot. I file di log del server web sono l'unica fonte che registra ogni richiesta reale di un bot dei motori di ricerca: timestamp esatto, URL, stato della risposta e indirizzo IP del crawler.
L'analisi dei log risponde a domande che non puoi risolvere in altro modo: quali pagine Googlebot scansiona ogni ora e quali non visita da mesi; dove il crawler incontra 404 e 500; se esistono loop infiniti di redirect; se il budget viene sprecato su duplicati parametrici o pagine dietro un login. Sono esattamente i dati che servono per decidere in modo informato la gestione del crawl budget.
Cosa dà l'analisi dei log
Richieste reali
Ogni richiesta HTTP di un crawler viene catturata nel file di log — niente campionamento, niente ritardi di aggregazione
Precisione temporale
Timestamp al secondo per tracciare i pattern di scansione per giorno della settimana e ora del giorno
Bot in un'unica fonte
Googlebot, Bingbot, Yandex e altri — tutti i crawler in un solo file, confrontabili in un'unica vista
Ritardo dei dati
I log sono disponibili subito — nessuna attesa di riscansione o aggiornamento dei report GSC
Come accedere ai file di log
Il percorso dei log dipende dal server web e dal provider di hosting. Sulla maggior parte dei VPS e server dedicati i file di log sono accessibili direttamente via SSH. Per l'analisi servono in genere gli access log degli ultimi 30–90 giorni: una finestra abbastanza lunga da rivelare pattern stagionali restando attuale.
| Server / piattaforma | Percorso log di default | Note |
|---|---|---|
| Nginx | /var/log/nginx/access.log | Rotazione via logrotate. Archivi: access.log.1, access.log.2.gz ecc. |
| Apache | /var/log/apache2/access.log (Debian/Ubuntu) o /var/log/httpd/access_log (RHEL) | Il formato può essere CLF o Combined — controlla la direttiva LogFormat |
| cPanel / WHM | ~/access-logs/<domain> o File Manager → Logs | Spesso suddivisi per dominio. Raw Access disponibile nell'interfaccia cPanel |
| Cloudflare Workers / Enterprise | Logpush API → S3, R2, GCS | Solo piano Enterprise. Per Free/Pro — Workers Analytics Engine |
| AWS CloudFront | Bucket S3 configurato in Distribution settings → Logging | Log ogni 5–10 minuti, compressi gzip |
| Google Cloud / GCS | Cloud Logging → export su BigQuery o GCS | Ideale per grandi volumi — query SQL direttamente in 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 in /etc/logrotate.d/nginx in anticipo — i log cancellati non si recuperano.Struttura del record di log: formato CLF
La maggior parte dei server usa di default il Combined Log Format (CLF) — una versione estesa del Common Log Format. Ecco i campi che contano per l'analisi 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 | Rilevanza SEO | Cosa guardare |
|---|---|---|
| Indirizzo IP | Alta | Range IP di Googlebot, Bingbot, Yandex — servono a filtrare i crawler reali |
| Timestamp | Alta | Frequenza di scansione, data dell'ultima visita a URL specifici |
| Richiesta (metodo + URL) | Critica | Quali URL vengono scansionati: pagine utili, duplicati, parametri, percorsi inesistenti |
| Stato HTTP | Critico | 200 (bene), 301/302 (redirect), 404 (link morti), 500 (errori server) |
| Byte inviati | Media | Dimensione anormalmente piccola — segno di pagina vuota o risposta stub |
| User-Agent | Critico | Distingue Googlebot dagli altri bot e dagli utenti reali |
Filtraggio: isolare i crawler
I log grezzi contengono un mix di richieste utente, ping di monitoring, bot spam e crawler dei motori. Per l'analisi SEO devi estrarre solo i robot dei motori. L'approccio più affidabile è filtrare per stringa User-Agent e poi verificare l'IP via 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. Per un filtraggio accurato, verifica gli IP via reverse DNS: il vero Googlebot risolve su *.googlebot.com. Google pubblica i range IP ufficiali tramite l'API Special IP Addresses.Metriche SEO chiave
Dopo il filtraggio, passa all'analisi. Ecco sei metriche che danno il massimo degli insight per il minimo sforzo.
Quante volte Googlebot ha visitato uno specifico URL nel periodo. Le pagine con PageRank alto e aggiornamenti frequenti vengono scansionate più spesso. Se una pagina importante è stata visitata una sola volta in 30 giorni, Google la considera di poco valore.
Target: pagine chiave ≥ una volta ogni 3 giorniQuota di 4xx e 5xx nelle richieste di Googlebot. I 404 sprecano crawl budget. I 500 segnalano problemi sistemici. Un tasso di errore alto riduce la fiducia di Google nel sito.
Benchmark: 4xx < 3%, 5xx < 0,5%Quale frazione delle richieste di Googlebot finisce in 301 o 302. I redirect consumano budget e rallentano la reindicizzazione. Le catene di redirect (A → B → C) sono particolarmente dannose.
Benchmark: 3xx < 10% di tutte le richieste del botStesso contenuto sotto URL diversi: con e senza www, con e senza slash finale, con parametri UTM. Ogni variante viene scansionata separatamente — una perdita diretta di crawl budget.
Target: un URL canonical per ogni contenutoPagine chiave (categorie, landing, nuovi articoli) che Googlebot non ha mai richiesto in 30 giorni. Indica problemi di link interni o un blocco in robots.txt.
Target: 0 pagine importanti senza scansione in 30 giorniPagine che Google sta scansionando ma non dovrebbe: pannelli admin, pagine di sessione, ambienti di test, duplicati parametrici. Sprecano budget e a volte introducono rischi di sicurezza.
Target: 0 URL sensibili nei log GooglebotStrumenti di analisi
Tre strumenti coprono il 95% dei compiti di analisi dei log: la riga di comando per verifiche rapide, una GUI specializzata per l'analisi profonda, e Python/BigQuery per grandi volumi e automazione.
Bash: analisi rapida senza installazione
# 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
Strumento a pagamento (259 $/anno) ma indispensabile per l'analisi regolare. Carica il file di log, lo parsa e costruisce report: segmentazione Bot vs Browser, dashboard degli stati, mappe di calore della scansione per directory e lista delle pagine senza scansione. Supporta Nginx, Apache, IIS, CloudFlare, Fastly e formati CSV personalizzati.
Python: analisi flessibile per file grandi
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}')Pattern di scansione: cosa cercare
Le metriche grezze non significano nulla senza interpretazione. Ecco pattern specifici da cercare nei log di Googlebot.
Pattern 1: scansionata ma non indicizzata
Googlebot visita una pagina regolarmente, ma in GSC non compare mai come «indicizzata». Cause: meta tag noindex, blocco X-Robots-Tag negli header HTTP, contenuto povero, canonical che punta a un'altra pagina. Confronta la lista degli URL scansionati regolarmente con le pagine indicizzate dall'API GSC — le discrepanze svelano le pagine problematiche.
Pattern 2: crawl storm
Un picco improvviso di richieste di Googlebot in una finestra breve è spesso segno di URL generati all'infinito: facet, URL parametrici di paginazione, token di sessione negli URL. Un crawl storm può esaurire l'intero budget in ore e mettere sotto pressione il server. Traccia le richieste in un istogramma per ora — i picchi anomali si vedono subito.
Pattern 3: nuove pagine ignorate
Una pagina nuova è stata creata tre settimane fa, aggiunta alla sitemap, ma Googlebot mostra zero richieste nei log. Cause: nessun link interno alla pagina, la sitemap non viene riscansionata dal bot, la pagina è troppo profonda nella gerarchia. Verifica i nuovi URL con lo strumento di ispezione GSC e cerca la data di prima comparsa nei log.
Pattern 4: risorse che bloccano il rendering
Googlebot richiede non solo pagine HTML ma anche CSS, JS e immagini. Se le risorse critiche sono bloccate in robots.txt, il bot non può renderizzare la pagina e potrebbe sottovalutarla. Controlla nei log: quale percentuale delle richieste di Googlebot punta a risorse statiche, e se qualche file JS necessario è bloccato.
Problemi comuni e soluzioni
| Problema nei log | Causa radice | Soluzione |
|---|---|---|
| Molti 404 da Googlebot | Pagine cancellate che hanno ancora link esterni o interni puntati | 301 alla pagina viva più vicina + rimuovi i link interni rotti |
| URL parametrici nella scansione | Tag UTM, ordinamenti e sessioni non bloccati in robots.txt | Disallow in robots.txt + canonical all'URL pulito sulle pagine stesse |
| Catene di redirect (A→B→C) | Redirect accumulati dopo le ristrutturazioni | Riduci a un solo salto — aggiorna tutti i link in uscita |
| Pagine /admin, /staging nei log | Sezioni di servizio non bloccate | Disallow /admin/ in robots.txt + HTTP auth su staging |
| Risposte 5xx a Googlebot | Sovraccarico del server nei picchi di traffico o errori backend | Ottimizza il TTFB, aggiungi cache, configura il rate limiting per i crawler |
| Pagina importante non scansionata | Nessun link interno, troppo in profondità nella gerarchia, assente dalla sitemap | Aggiungi alla sitemap + aggiungi link interni dalle pagine chiave |
| Duplicati www / non-www | Nessun redirect 301 configurato verso la versione canonical del dominio | 301 da non-www a www (o viceversa) a livello nginx/Apache |
| robots.txt blocca JS/CSS necessari | Disallow /assets/ o /static/ da template | Rimuovi il blocco per le risorse critiche necessarie al rendering |
# 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 -20FAQ
In sintesi
L'analisi dei file di log è l'audit SEO più onesto che esista. GSC mostra aggregati, Screaming Frog simula, ma i log catturano ogni decisione reale di Googlebot. La pipeline è lineare: ottieni i log di 30–90 giorni → filtra i crawler per User-Agent con verifica DNS → calcola le sei metriche chiave → incrocia con l'indice GSC → correggi le discrepanze.
Parti con tre comandi Bash: top 20 degli URL scansionati, distribuzione dei codici di stato, top dei 404. In un'ora avrai una lista concreta di azioni: redirect da configurare, URL da bloccare in robots.txt, pagine da aggiungere alla sitemap. È più rapido ed economico di qualsiasi audit a pagamento — i dati sono già sul tuo server.
Con quale frequenza analizzare i file di log?
Servono i log se il mio sito è piccolo (< 500 pagine)?
Come distinguo il vero Googlebot da un impostore?
La frequenza di scansione influisce direttamente sul posizionamento?
Cosa fare se Googlebot scansiona troppo aggressivamente e sovraccarica il server?
Check it with SpiderHead
Free and local: run the audit on your own machine.



