Three things claim to tell you how search engines treat your site, and two of them are guessing.
Analytics only records the visits that ran its JavaScript, which crawlers do not. Search Console shows you a sampled, aggregated, two-day-late version of what one search engine did. Your access log is the complete record of every request anyone made to your server, including all the ones that failed.
It is also the file nobody reads, because the good tool for reading it costs money and the free ones want you to upload it. We built a free server log analyser that reads the file in your browser instead. This is what to look for once you open it.
What is actually in the file
One line per request. Who asked, when, what they asked for, what your server answered, and what they claimed to be.
66.249.66.1 - - [14/Sep/2026:10:14:32 +0000] "GET /pricing HTTP/1.1" 200 8431 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
That is the combined log format, and it is what Apache and nginx write by
default. The address at the front, the timestamp, the request, then
200 for the status and 8431 for the bytes sent, then
the referring page and the user agent string. Multiply by a few hundred
thousand and you have a month of your site's life, which is unreadable by eye
and trivial for a machine.
Why free is the hard part
The best known desktop log analyser is genuinely good and the free tier stops at a thousand lines, which for most sites is under an hour of traffic. A licence is around a hundred pounds a year, which is fine if you do this professionally and hard to justify if you want to look at your logs twice.
The browser-based ones are free in a different sense: you upload the file and they process it on their servers. That is worth pausing on, because an access log is a list of the IP addresses of everyone who visited you, each one tied to the pages they read and the times they read them. In most jurisdictions that is personal information about your visitors, and sending it to a vendor is a disclosure you probably have not written down anywhere.
There is no technical reason it has to work that way. Parsing text and counting things is exactly what a browser is good at. So ours does the whole job in the page, which means no line limit, no account, and nothing to disclose because nothing is transmitted.
The five things worth looking at
1. What failed for a crawler
This is the one to read first and the one people skip. Every 404 and 500 returned to a search engine is a fetch it spent on nothing, and a page it cannot fetch is a page it cannot rank. Sort the errors by how often they were hit. A URL that has returned 404 to a crawler two hundred times in a month is still linked from somewhere, and the fix is either to restore it or to redirect it, not to hope.
2. Where the crawling actually went
Split the crawler requests four ways: real pages, static files, URLs with query parameters, and errors. A healthy site is mostly the first. If a significant share is parameter URLs, something is generating endless variants of the same page, usually filters, sorts, session identifiers or tracking parameters that were never meant to be crawlable. If a large share is images and stylesheets, the crawl is being spent on assets rather than content.
3. Which crawlers, and how the mix is changing
Search engines and AI crawlers are not the same thing and your log will show both. GPTBot, ClaudeBot, PerplexityBot, CCBot, Bytespider, Amazonbot and a growing list of others fetch pages for reasons that have nothing to do with ranking you. Some are gathering training data, some are fetching a page because a person just asked a question about it. Whether you allow them is a decision worth making deliberately, and you cannot make it sensibly without first knowing how much of your bandwidth they are using.
Worth knowing: Google-Extended and Applebot-Extended
are robots.txt tokens for opting out of training, not crawlers. They will never
appear in your log, and any tool that reports them is inventing traffic.
4. Crawling over time
Plot requests per day and look for the cliff. A crawl that stops abruptly is
almost always a robots.txt change, an accidental noindex, a
certificate that expired, or an outage nobody noticed because the humans were
asleep. A crawl that spikes is usually something that is not a search engine.
Either way the date tells you where to look in your deploy history.
5. What is in your sitemap and never gets fetched
Compare the URLs in your sitemap against the ones search engines actually requested. Anything in the sitemap that has never once been fetched is a page you have asked to be indexed and nobody has come for. Usually it has no internal links pointing at it, which is a five minute fix, or it is thin enough that nothing wants it, which is not.
Proving a crawler was really Googlebot
Anything can put Googlebot in its user agent, and plenty of
scrapers do, precisely because people allowlist it. Your log cannot settle this
on its own, and a tool that prints a green tick next to a claimed crawler
identity is guessing.
The real method is DNS, in two steps. Look the address up backwards, then look the name you get back up forwards, and check you land on the address you started with:
host 66.249.66.1
# 1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com
host crawl-66-249-66-1.googlebot.com
# crawl-66-249-66-1.googlebot.com has address 66.249.66.1
A genuine Googlebot resolves to a name ending googlebot.com or
google.com, and Bingbot to search.msn.com. Google,
Bing and the larger AI crawler operators also publish the address ranges their
crawlers use, which you can check an address against directly. No browser can
make a DNS query, so this step happens in a terminal, and our tool gives you
the command with the address already filled in rather than pretending it can do
it for you.
What a log can do is flag the claims that contradict themselves. One address
that is both Googlebot and a person browsing in Safari is not Googlebot. One
that claims to be crawlers run by three different companies is not any of
them. One that asks for /wp-login.php and /.env is
not a search engine at all.
What a log will not tell you
It is a record of requests, so it knows nothing about what happened after the response left your server. It cannot tell you whether a page rendered, what a visitor did next, whether anyone read anything, or what position you hold for a query. It also stops at your edge: if a CDN served the request from cache, your origin log never saw it, which is why a site behind Cloudflare or Fastly should read the edge logs rather than the origin's.
Within those limits it is the only source that is neither sampled nor inferred. Every other tool tells you what it thinks happened. The log is what happened.
Reading yours
Download your access log, open the free server log analyser, and drop the file on the page. Apache or nginx, combined or common format, plain or gzipped, any size. It is free, it has no line limit, it needs no account, and your visitors' addresses stay on your machine, which is the only arrangement we would use ourselves.