Server log analytics · read from access.log
Server log analytics: every request your server answered, in five groups
Server log analytics reads the line your web server already writes for every request. Skald sorts each line into one of five groups, and the five add up to the whole log.
Server log analytics is web analytics read from your web server's access log, the record it keeps of every request it answers, instead of from a script tag in the page. A script tag counts the browsers that run it. The log also holds the AI assistants, search engines and bots that never run a script.
30-day free trial · no card · we set it up within one working day · free to self-host
- 09:14:02 203.0.113.24 "GET /pricing/" 200 "GPTBot/1.2"AI · training
- 09:14:03 198.51.100.7 "GET /" 200 "google.com" Chrome/130people
- 09:14:05 203.0.113.66 "GET /blog/" 200 "Googlebot/2.1"search
- 09:14:06 198.51.100.140 "GET /docs/" 200 "ChatGPT-User/1.0"AI · live fetch
- 09:14:10 192.0.2.14 "GET /.env" 404 "zgrab/0.x"bots · probe
- 09:14:13 198.51.100.2 "GET /healthz" 200 "curl/8.5.0"ours · deploy check
Sample lines. Each one lands in exactly one of five groups. A script tag would have run for the second line only.
[01] what the log holds
What your access log records that a script tag never sees
A script tag runs only in a browser that runs JavaScript. Your server writes a line for every request anyway. Pick a group to see who is in it, and whether a script tag would have counted them.
People
A browser that drew the page: it fetched the page's own scripts or styles, or sent an event from it. Skald shows visits as at most this many people, never requests passed off as people. A person who clicked a link in an AI answer is counted here too, with the assistant kept as the visit's source.
198.51.100.23 "GET /docs/setup/" 200 "https://chatgpt.com/" Safari/605 → people · source ChatGPT
Script tag sees it: yes, when the browser runs the tag and the visitor accepts it.
AI assistants
Crawlers such as GPTBot and ClaudeBot read your pages to train a model. Fetchers such as ChatGPT-User and Claude-User fetch a page while someone waits for an answer. Skald keeps the two apart, and checks each name against the addresses its owner publishes.
198.51.100.140 "GET /docs/" 200 "-" "ChatGPT-User/1.0" → AI assistants · live fetch
Script tag sees it: no. AI crawlers and fetchers do not run JavaScript.
Search engines
Googlebot, Bingbot and the other indexers, each checked against its owner's addresses or DNS. You see what they fetched, what they missed, and how fast your server answered them.
203.0.113.66 "GET /blog/" 200 "-" "Googlebot/2.1" → search engines · verified
Script tag sees it: no.
Bots and scanners
Scanners asking for /.env or /wp-login.php, scrapers sending a browser's name, and fakes using a crawler's name from the wrong address. A client that asks for a secret or config file is a bot for the whole day, so its other pages never count as visits.
192.0.2.14 "GET /.env" 404 "-" "zgrab/0.x" → bots · probe
Script tag sees it: no, or it counts the scraper as a visitor.
Your own traffic
Your office, your team, your own crawler, deploy checks and tests. Add addresses with labels in Settings > Internal traffic, and they form their own group, never people. Past days keep the figures they had.
198.51.100.2 "GET /healthz" 200 "-" "curl/8.5.0" → your own traffic · deploy check
Script tag sees it: it counts you as a visitor, unless you filter yourself out.
[02] nothing left over
Five groups that add up to the whole log
Every request lands in exactly one group. Before Skald reports a day, it checks that the five groups sum to the lines it read.
Lines are not visits. One page view loads many files: the page, its scripts, its styles, its images. Skald counts visits from pages, and the server load view on Site > Health shows every file your server answered, split into the same five groups.
A browser-like visit is people only when it loaded the page's own files. One that opens 6 or more pages within 2 seconds is too fast to be a person, and goes to bots.
| Group | Lines | Share |
|---|---|---|
| People | 415 | 22.5% |
| AI assistants | 322 | 17.4% |
| Search engines | 147 | 8.0% |
| Bots and scanners | 940 | 50.9% |
| Your own traffic | 24 | 1.3% |
| The whole log | 1,848 | 0 unsorted |
Sample data. The 940 lines from bots and scanners are counted, in their own group, and none of them as people.
[03] from lines to visits
From log lines to visits, sources and places
The log holds an address, a time, a page, a status, a referrer and a user agent. That is enough for visits, sources, campaigns, countries and returning visitors, read in plain words.
Visits and sources
One address and browser, with no gap over 30 minutes, is one visit. Coming back from ChatGPT, a search or a campaign starts a new visit, so the real source shows. No referrer reads "Direct". A value the log lacked reads "Not recorded".
Campaigns and ad clicks
UTM tags, referring sites and ad networks from their click IDs, never the ID's value: Google Ads on iPhone (gbraid, wbraid), TikTok and X too. The ChatGPT and Claude phone apps count as AI; YouTube, WhatsApp and Telegram as social.
Countries and cities
From the log's own country field (Cloudflare's, or nginx's
cc=), or from a free DB-IP GeoIP file on Skald's server. With neither, a country stays "Not recorded". It is never guessed.Real pages only
A page view is a page your server answered with 2xx or 304. Images, scripts, redirects and calls under
/api/never are. A page shown from the browser's cache (304) counts, and keeps the visit's source.Next.js clicks
A click inside a Next.js site sends no HTML request. One field at the end of the log format lets Skald count every such click as a page view, and never a prefetch. Caddy's log already holds it.
Returning visitors
Skald recognises a returning visitor over 30 days with a keyed hash, so the figure never depends on keeping the address. How long addresses are kept is your setting.
[04] where your site runs
Which web servers, CDNs and hosts Skald reads
Skald needs to see your site's requests. A web server's log, a CDN's log or a host's log drain all work. Without any log, only the script tag is left, and it sees people only.
| Your site runs on | How Skald gets the requests | AI crawlers and bots seen |
|---|---|---|
| nginx or Apache, on your server | The access log. One command on the server sends it, with or without Docker. nginx · Apache | Yes |
| Caddy, on your server | Caddy's JSON access log. Caddy | Yes |
| Cloudflare, any plan | The Skald Worker posts a record of each request, cached pages too. Cloudflare | Yes |
| Vercel Pro or Enterprise | A log drain: Vercel posts its request logs. Vercel | Yes |
| CloudFront or Fastly | The CDN's own log, synced to Skald's server. CloudFront · Fastly | Yes, but the audit does not recount these logs yet, so their days are withheld |
| Shopify, Webflow, Squarespace | No log and no drain: the script tag and webhooks only | No |
What server log analytics does not do
- Without a server or CDN log (Shopify, Webflow, Squarespace, or the script tag alone), AI crawlers, search crawlers and bots are not seen at all. They do not run scripts.
- A user agent is a claim. People is an upper bound, never a count of humans: a scraper that drives a real browser and loads the page's files looks like a reader.
- A person who blocks scripts and styles is not counted as a person.
- Referrers are often stripped, so clicks from AI answers are a floor. A click from a Google AI Overview arrives as plain google.com; Google AI Mode is told apart only when the click carries
udm=50. - Behind a CDN, read the CDN's log, never the origin's as well: a cache miss is in both.
- It does not replace Search Console for queries and rank, or Google Analytics for ad spend. It sits beside them.
in this section
How your log reaches Skald, one page each
keep reading
More on server log analytics
questions
Server log analytics FAQ
Straight answers, including what Skald does not do.
What is server log analytics?
Server log analytics counts your website's traffic from the web server's own access log: one line for every request the server answered. It sees people, and also AI crawlers, AI assistants fetching a page for someone, search engines and scanners, none of which run a script tag. Skald sorts every line into five groups that add up to the whole log.
How is server log analytics different from Google Analytics?
Google Analytics counts the browsers that run its script and accept it. A server log records every request, script or not, so it also holds AI crawlers, search crawlers, bots and people who block scripts or decline a consent banner. Skald does not replace Google Analytics: it sits beside it and shows what a script cannot see. A Google Analytics alternative that reads logs.
Do I need to add a script or a cookie to my pages?
No. Counting from the log needs nothing in your pages and no cookie. Skald's script tag is optional: it adds what a log cannot see, such as a form started, a phone link clicked or a booking made inside a widget. The analytics script tag.
Which web servers and hosts can Skald read?
nginx and Apache (the combined format, or Skald's extended one), Caddy's JSON log, the Skald Worker for Cloudflare on any plan, Cloudflare Logpush, a Vercel log drain (Vercel Pro or Enterprise), CloudFront standard logs and Fastly JSON logs. Shopify, Webflow and Squarespace give no log, so there Skald sees people through the script tag only.
Are bots counted as visitors?
No. Every request lands in exactly one group, and bots and scanners have their own. A browser-like visit counts as people only when it loaded the page's own files, and a visit that opens 6 or more pages within 2 seconds is filed as a bot. Visits are an upper bound on people, never a count of requests. How server log analytics works.
Does the server log hold personal data?
Yes: an access log holds each visitor's IP address. Skald keeps addresses in full, shortened or not at all, as you choose in Settings > Data retention. If you self-host, the log and the figures stay on your own server.
$ tail -f access.log | skald
See what AI does with your site. Free for 30 days.
No card. We set up hosted Skald for you within one working day, or you self-host it free. Every line of your log, sorted and added up.