Notes from the work

Log file analysis for SEO: what your server actually saw

Log file analysis for SEO is rarely about crawl budget on a small site. It is about seeing which bots hit you, and getting logs your host quietly hides.

John KyprianouJohn Kyprianou13 min read

Screaming Frog will crawl your site in an afternoon and hand you a tidy list of every URL it found. That is a simulation. Not one line of it proves Googlebot asked for any of those pages, or what your server said when it did.

The access log is the only record of what actually happened. The catch, which most guides skip, is that the reason to open it has changed, and on most modern hosting you may not be able to open it at all.

Diagram of a server access log with lines sorted into Googlebot, AI training crawlers and user-triggered retrieval bots, by SEO Turtle

What a log line actually contains

Every request that reaches your web server gets one line in the access log. Here is an invented but realistic one in the common Apache format:

203.0.113.42 - - [14/Sep/2026:09:12:33 +0300] "GET /products/olive-oil-500ml?ref=nav HTTP/1.1" 200 18342 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Field Value in the example What it tells you
Client IP 203.0.113.42 Who made the request. The only field a bot cannot fake without controlling the network.
Timestamp 14/Sep/2026:09:12:33 +0300 When, in the server's timezone.
Method and path GET /products/olive-oil-500ml?ref=nav What was asked for, query string included.
Status code 200 What the server answered.
Bytes 18342 Response size. Useful for spotting empty pages.
Referrer "-" Where the request claims it came from. Crawlers usually send nothing.
User agent Mozilla/5.0 (compatible; Googlebot/2.1; ...) Who the client says it is. Anyone can type this.

Nginx uses the same layout by default; IIS and load balancers use the W3C extended format, which reorders the fields. Two things matter: the path is the raw request, so you see parameter URLs exactly as the bot sent them, and the user agent is a claim, which we will come back to.

Why crawl budget is probably not your problem

The classic pitch for log file analysis is crawl budget: find where Googlebot wastes its time, cut the waste, and your important pages get crawled more. That was reasonable for a site with two million URLs in 2018. It is mostly theatre for a site with two thousand.

Google's own crawl budget documentation is explicit about who it is for: sites with a million or more unique pages whose content changes weekly, or sites with ten thousand or more pages whose content changes daily. Under those lines, you do not need to think about it. The document also never tells you to analyse your logs. That idea comes from the SEO industry.

Its two concepts are still worth knowing. Crawl capacity limit is Google's cap on the total time your server spends holding connections open for its crawlers, factoring in both the number of parallel connections and their duration. Crawl demand is separate: each crawler has its own appetite, and for Googlebot it varies with site size, update frequency, page quality and relevance compared with other sites.

For a small site, capacity is almost never the constraint. If Google is crawling less than you would like, that is demand, and demand is a quality judgement, the same conversation as crawled, currently not indexed. Logs show the symptom, not the verdict.

For the crawl questions a small site does have, Search Console's Crawl stats report is usually enough. It breaks Googlebot's requests down by response code, file type, crawl purpose (Discovery for first-time fetches, Refresh for recrawls) and Googlebot type (smartphone, desktop, image, AdsBot and so on), covering roughly the last 90 days. Use it first.

What that report cannot show you is anything that is not Google. The bot population hitting a typical site has fractured into search index crawlers, AI training crawlers, and user-triggered retrieval bots, and all three land in the same access log. None appear in any Google report, and Ahrefs and Semrush do not see them either, because those tools crawl you themselves. That is the honest 2026 case for logs on a small site. First, though, getting hold of the file.

Getting the logs, by host

Every log file guide assumes an Apache box you can SSH into. Almost nobody in Cyprus or the UK runs one.

Platform Where the logs are Practical catch
Apache or Nginx on a VPS /var/log/apache2/ or /var/log/nginx/, access.log plus rotated copies Rotation. Default configs keep a handful of days, so last month is often already deleted. Change retention before you need it.
cPanel shared hosting Metrics, then Raw Access in the dashboard, downloaded as a gzipped archive Often only the current partial log, plus archived months if you switched archiving on. Many hosts leave it off by default. Turn it on today.
Cloudflare (proxied) Logpush delivers request logs in near real time to a storage bucket or SIEM Enterprise only. The availability table lists Free, Pro and Business as no. The one exception is Workers Trace Events Logpush on the Workers Paid plan, which covers Workers, not your origin traffic.
Vercel Runtime Logs in the dashboard, covering function and middleware invocations Retention is short: Hobby 1 hour, Pro 1 day, Enterprise 3 days, and 30 days on either paid tier only with Observability Plus. Static requests only appear when served from cache, so for every static hit you need Log Drains pushing to a third party.
Shopify Nowhere Shopify does not expose raw access logs to merchants. Log file analysis is simply unavailable. Use the Crawl stats report for Googlebot and accept the blind spot for everything else.
Wix, Squarespace and most hosted SaaS Nowhere Same answer as Shopify. If the platform does not give you the log, no tool can conjure it.

The more managed the hosting, the less of the log you get, and the shorter you get it for. Cloudflare in particular now sits in front of a large share of Cyprus and UK sites, so the first server to see a crawler request is one you cannot read below Enterprise, with knock-on effects for AI visibility we covered in Cloudflare blocking AI crawlers. If you are on WordPress with a VPS or cPanel host, set retention to at least 30 days before you do anything else.

Verifying the bot is who it says it is

The user agent is a string the client sends, and scrapers send one that says Googlebot all the time, because plenty of sites whitelist the name.

Google's verification method has four steps. Run a reverse DNS lookup on the accessing IP from your log using the host command. Check that the domain returned is googlebot.com, google.com or googleusercontent.com. Run a forward DNS lookup on that domain name. Confirm it resolves to the same IP you started with. If any step fails, the request was not from Google. The 203.0.113.42 in the example above fails at step one, which is rather the point.

By hand this is tedious, so Google also publishes its crawler IP ranges as JSON in CIDR format: common-crawlers.json for Googlebot, special-crawlers.json for AdsBot. OpenAI publishes ranges the same way, for example gptbot.json.

Two details from Google's crawler list trip people up. Googlebot-News has a robots.txt token but no separate HTTP user agent, so it never appears as its own entry in a log. And Google-Extended, the control for whether your content trains Gemini, has no user agent of its own either: crawling happens under the existing Google user agents, so you cannot see it in a log as a separate thing, and it has no effect on Google Search either way. Google-InspectionTool, by contrast, is easy to spot: it is you pressing a button in URL Inspection or the Rich Results Test.

The three bot populations, and why the distinction is commercial

This table is the reason to open the log at all.

Bot Operator What it is for What it means for you
Googlebot Google Crawling for the Google Search index, with smartphone and desktop variants Block it and you leave Google Search.
GPTBot OpenAI Improving generative AI models. Disallowing it signals your content should not train foundation models (OpenAI) Blocking it withholds training use. It does not remove you from ChatGPT search.
OAI-SearchBot OpenAI Surfacing sites in ChatGPT search. OpenAI recommends allowing it and says sites that opt out will not appear in search answers A visibility decision, not a copyright one. Most businesses want this allowed.
ChatGPT-User OpenAI Fetching a page when a user asks ChatGPT to visit it, or through GPT Actions A person wants your page right now. Because it is user-initiated, OpenAI says robots.txt rules may not apply.
ClaudeBot Anthropic Collecting web content that could contribute to training generative AI models (Anthropic) The training crawler. Block it if you do not want your content used for training.
Claude-SearchBot Anthropic Navigating the web to improve search result quality and relevance The search-side crawler. Blocking it affects whether Claude can find you, not whether you train it.
Claude-User Anthropic Retrieving website content when a user asks Claude a question Same shape as ChatGPT-User. Someone asked, and your page was the answer.

Training crawlers take content and return nothing you can measure. Search crawlers decide whether you get cited. Retrieval bots are a human reading your page through an assistant. Blocking the first is a licensing decision, the second a distribution decision, the third turning away a reader.

The mistake we see constantly is a robots.txt rule from the "block all AI" wave that disallows every bot with an AI company's name in it. That blocks the training crawler, which may be intended, and the search and retrieval bots, which almost never is. Both companies let you control each bot separately; the specific rules are in our AI crawlers robots.txt guide.

Your log tells you which of these bots actually visit and whether your blocks work. A disallowed bot that keeps appearing is either ignoring the rule or is not who it says it is. Our robots.txt tester checks the rules; only the log shows the outcome.

What to actually look for, in priority order

With a verified log covering a few weeks, work through these in order.

  1. Pages being crawled that should not exist. Filter for Googlebot and sort the paths: parameter URLs, faceted navigation, internal search results, staging subdomains that never got locked down. On a small site this is where the surprises are.

  2. Important pages never requested at all. Diff your money pages against the paths Googlebot fetched. A page not requested in six weeks is usually an internal linking problem, not a crawl budget one.

  3. Status codes served to bots that differ from what you see in a browser. Bots carry no cookies and may come from an IP your firewall treats differently. If Googlebot gets 403s or 5xx on pages that load fine for you, nothing else matters until that is fixed.

  4. Redirect chains. A 301 followed by another request for the target that also returns 301, visible as consecutive lines from the same IP a fraction of a second apart. Each hop is a wasted fetch.

  5. Crawl frequency on money pages versus dead sections. Count hits per path per week. If your top category is fetched twice a month and a 2019 tag archive daily, your internal links are telling Google the wrong story. This needs weeks of data, so it goes last.

A log turns "should be fine" into "was fine on Tuesday at 09:12". That is why we pull logs where we can in a website audit, and say plainly when hosting makes it impossible.

Tools, briefly and honestly

For a site of a few hundred to a few thousand pages, grep and a spreadsheet genuinely do the job. Filter by user agent, cut out the path and status columns, pivot, done.

If you would rather not, the Screaming Frog Log File Analyser is the sensible choice at this scale. It reads Apache and W3C extended formats, covering Apache, IIS and Nginx, plus the Amazon Elastic Load Balancing format, and it verifies search engine bots automatically and shows the IPs spoofing them. The free version is limited to 1,000 log events and one project, enough to learn the tool but not for a real month. The paid licence is 129 euro a year.

It also matches any file with a URLs column against the log, so a crawl from the SEO Spider (the same tool used for custom JavaScript crawling) shows orphan URLs and pages Googlebot never fetched, which is the most useful view in the tool.

Enterprise log platforms exist and cost accordingly; for the sites this post is about, they are not worth it. If you have logs and want a second pair of eyes on what they show, or you are not sure what your hosting exposes, that is a normal part of our technical SEO work, and a free SEO review is a reasonable place to start.

Frequently asked questions

Do I need log file analysis if I already have Search Console?

For crawl budget on a site of a few thousand pages, no. The Crawl stats report shows Googlebot requests broken down by response code, file type, crawl purpose and Googlebot type over roughly the last 90 days, and that answers the question well enough. Logs earn their keep when you need to see the bots Google does not report on, or to check exactly what your server returned to a specific request.

Can I get server logs from Shopify?

No. Shopify, like most hosted SaaS platforms, does not expose raw access logs to merchants. That means log file analysis is simply unavailable on those stores, and any guide that implies otherwise is assuming hosting you do not have. Use the Crawl stats report in Search Console for Googlebot, and accept that you cannot see AI crawler traffic at the request level on that platform.

How do I know a Googlebot request in my logs is really from Google?

Anyone can send a user agent string that says Googlebot. Google's verification method is a reverse DNS lookup on the IP from your log, a check that the hostname ends in googlebot.com, google.com or googleusercontent.com, then a forward DNS lookup on that hostname to confirm it resolves back to the same IP. Google also publishes its crawler IP ranges as JSON files in CIDR format, which is faster at scale.

Should I block AI crawlers in robots.txt?

Decide per bot, because they do different jobs. GPTBot and ClaudeBot gather content that can feed model training. OAI-SearchBot and Claude-SearchBot are how ChatGPT search and Claude find sites to cite, and OpenAI says sites that opt out will not appear in its search answers. ChatGPT-User and Claude-User fetch a page because a person asked for it. A blanket rule blocks all three groups at once, which is rarely what anyone intends.

More on technical seo
John Kyprianou

John Kyprianou

Founder & SEO Strategist

John brings over a decade of experience in SEO and digital marketing. With expertise in technical SEO, content strategy, and data analytics, he helps businesses achieve sustainable growth through search.

Keep reading

More to think about.

All insights
Numbered image SEO checklist with found by Google, fast and sized right, and worth showing as the first three checks, and alt text as the fourth

Technical SEO

Image SEO: the checks that actually move something

Open the image audit on almost any site and the findings repeat: the hero is lazy-loaded, the gallery is a CSS background, every photo is stock, and the alt text is fine. Here is the order we would put the checks in, and why the camera makes original photos worth more than they were.

October 15, 2026
Diagram of a paginated product category where page 1 is crawlable and pages 2 to 6 are cut off, leaving their product pages without internal links, by SEO Turtle

Technical SEO

Pagination SEO: what to index, what to block, and what to fix

A category with six pages where everything past page 1 is invisible quietly orphans every product on pages 2 to 6. Most pagination advice was written for million-page retailers and makes this worse on a 400-page site. Here is what Google actually asks for, the mistake that causes most of it, and an afternoon audit to find out whether you have it.

October 13, 2026
Diagram of a website sending Google contradictory canonical signals from internal links, sitemap and redirects, with Google selecting a different URL, by SEO Turtle

Technical SEO

Why Google ignores your canonical tag, and how to fix each case

The ticket usually says the canonical is correct and Google is still indexing the wrong URL. Most of the time the tag is fine and the rest of the site is arguing with it. Here is how to find out which URL Google actually picked, what each Search Console status really means, and which contradictions to go and remove.

October 7, 2026
Diagram of a small website's internal links showing an orphan page, a service page buried several clicks deep and a link pointing at a redirect, by SEO Turtle

Technical SEO

Internal linking audit: orphan pages, click depth and wasted links

Most internal linking advice is written for six-figure e-commerce sites and does nothing for a 200-page business site. The problems there are smaller and more specific: orphan pages, money pages buried five clicks deep, navigation anchors that all say the same thing, and links still pointing at old URLs. Here is how we find each one and what we fix first.

September 24, 2026
Diagram of an ecommerce filter sidebar producing hundreds of URL combinations, with a small set marked index and the rest marked block, by SEO Turtle

Technical SEO

Faceted navigation SEO: which filter pages to index and which to block

A filter sidebar can generate more URLs than your store has products, and the two standard answers (index everything, block everything) are both wrong. Here is how to decide facet by facet, why rel=canonical does not fix the crawl problem, and what to check in Search Console after you ship the change.

September 22, 2026