Diagnose crawling, rendering, and indexing
How to Analyze Server Logs for SEO: Find Crawl Patterns Worth Investigating
Analyze server logs for verified bot requests, URL patterns and response codes—then trace each finding to a checkable follow-up.

Server log analysis is useful when the question is specific: Which URLs did a search bot request, when, and what did the server return? Start with individual requests, verify bot identity where you can, and group the rows only after preserving a way back to each event. A busy-looking total is less useful than five requests to the same broken URL that you can trace to a link.
What a server log can—and cannot—show
A server log records requests, not search results. Depending on its configuration, a record may contain an IP address, timestamp, request method and URI, HTTP status, and user agent. The requested path and query string matter: /products/ and /products/?sort=price are different requests when you are investigating URL generation. Log structure and available fields vary by server and configuration, so inspect the actual files before designing a report. Builtvisible’s explanation of log fields is a useful reference for what to look for.
A request row can show that a particular client requested a URL at a particular time and received a recorded response. It does not show that the page was indexed, how it rendered, or where it ranks. Even a 200 is a response to a request, not an indexing result.
Prepare a sample you can trace back to requests
Choose a defined period—for example, two complete weeks—and note which log files and hosts it covers. Parse at least the timestamp, client IP, requested URI including any query string, status, and user agent when those fields are available. Keep the request method too if it is present. Files may need parsing before they are usable for analysis, as Ahrefs’ log-file overview notes.
Retain an event-level table alongside any summaries. Each grouped count should lead back to its constituent URLs, timestamps, statuses, IPs, and user-agent strings. Do not discard query strings or collapse all rows for a path into one record at import time: either step can hide the distinction you need to investigate. If logs from multiple hosts are combined, retain enough host context to tell which site handled a request.
A log-file analyser can help with this work; for example, Screaming Frog’s Log File Analyser offers per-URL event data by timestamp and reports for redirects, errors, and inconsistent response codes. Whatever tool you use, check its parsed rows against a few original entries before trusting its totals.
Separate verified requests from bot claims
Filter on a bot user agent to find candidates, not confirmed bot requests. A client can send a crawler-looking user agent. For Googlebot candidates, run a reverse-DNS lookup on the request IP and check that the resulting hostname belongs to the expected googlebot.com or google.com domain; then forward-lookup that hostname and require it to return the original IP. This Googlebot verification example describes both lookups. Preserve the IP, lookup result, and pass/fail decision with the request or in a joinable verification table.
Keep failed or unchecked user-agent matches separate from verified Googlebot rows. Do not silently call requests from another named bot verified merely because its user-agent string matches; use an appropriate identity check before making that claim. Otherwise, a graph labelled “Googlebot requests” may partly describe clients that only said they were Googlebot.
Group requests, then pick a follow-up
For verified requests, group by exact URI, date, and response status; also roll up related paths into patterns such as /search?…, /category/…?page=…, or an old-URL directory. Count requests and record the first and last event in the selected period. These counts describe these logs over these dates, not how often a search engine always crawls the site or whether a URL is inherently a problem.
Use each pattern to choose a check:
- Repeated
4xxor5xxresponses: Open the affected request rows. Check where the URLs are linked and whether the failing response still occurs. A404may point to a stale link; a5xxwarrants a closer look at the server response. - Recurring redirects or inconsistent statuses: Trace the exact URLs and their destinations, then check whether internal links still use the redirecting URLs and whether the same URL returns different statuses at different times. Redirect and inconsistent-response reports are useful precisely because they identify requests to inspect, not because every redirect is an error.
- Concentrated parameter or pagination requests: Identify the query strings and page sequences involved. Check which navigation generates them and whether those variants are intentional. Heavy activity on a URL pattern can be a lead for investigating faceted navigation or pagination, not proof of a crawl-budget problem.
- Little observed activity on important URLs: Compare a list of important URLs with the URLs in the sample, then inspect their internal links and navigation placement. Absence from a bounded log sample is not proof that a URL was never requested or cannot be discovered. This log-analysis workflow similarly treats low activity on important pages as a signal to investigate internal discoverability.
One small example: two different questions
Suppose the following are illustrative rows from a defined sample. The underlying records retain the client IP and user agent; each row marked Googlebot passed the reverse- and forward-DNS check. These are teaching data, not results from a live site.
| Timestamp | Requested URI | Status | Identity check |
|---|---|---|---|
| 10 May, 09:12 | /old-guide |
301 | Googlebot verified |
| 12 May, 16:04 | /old-guide |
301 | Googlebot verified |
| 13 May, 11:30 | /guides/widgets/?sort=recent |
200 | Googlebot verified |
The first two rows justify checking whether internal links still point to /old-guide and where its redirect leads. The third justifies checking whether the sorted variant is deliberately generated by navigation. Neither question is answered by adding the three rows together. In particular, these requests alone cannot establish that the variant displaced another URL from crawling.
After a targeted change—say, updating links that still point to /old-guide—collect a later, defined period and repeat the same parsing, Googlebot verification, and URL/status grouping. Compare requests to that exact old URL and their responses across the two periods. If fewer requests to it appear, you have measured a change in observed requests within those samples; if it still receives 301s, those are still recorded redirects. Check the individual rows for remaining sources. Neither comparison demonstrates an indexing or ranking change.




