Analyse your Nginx access log for bots, crawlers and errors

Salience streams your existing access log and turns it into verified bot identities, crawl and error analysis, and alerts that name the addresses, paths and user agents involved, without touching your Nginx configuration or adding anything to the request path.

Any server running Nginx, live in about ten minutes with no config change. Archived logs import too.

The Log Explorer page for demo-site.example once Nginx is connected through Vector agent: the Website setup strip shows Logs Receiving, and the table fills with Googlebot requesting /products/wireless-headphones, status 200, Verified; ClaudeBot requesting /guides/setup/, status 200, Verified; Googlebot (claimed) requesting /admin/, status 404, Unverified; Bingbot requesting /old-product-url, status 404, 404 spike. First hour of the tail: 22,116 requests.

Other log sources

Nginx records every request, and most of that log goes unread

Whether it is fronting an application, terminating TLS or serving static files, your Nginx writes a complete record of every request. That file is usually consulted only after something has gone wrong.

Tailing and grepping a log during an incident, reconstructing what happened after the fact rather than being told while there is still time to act.

Treating the user-agent field as an identity, because verifying a claimed crawler against published address ranges by hand, across millions of lines, is not realistic.

Watching request-rate graphs in your monitoring stack that show traffic is up, without any way to say which clients, on which routes, or whether they were genuine.

Losing the week you actually wanted to compare against, because logrotate already compressed and discarded it.

Salience reads the same log as it is written

Lines stream from the files your access_log directives already write: humans, verified crawlers, AI agents and suspicious automation, separated and counted.

The Salience dashboard for demo-site.example, last 24 hours. Website setup 5 of 6 completed. Traffic over time in fifteen-minute buckets, human and bot requests stacked. Bot identity evidence: 12.1K verified requests, 762 unverified claims, 2.7K with verification unknown. Total requests 34.2K, up 7.0% on the previous period. Unique IPs 15.3K, up 2.0%. Bot traffic 45.5%, down 1.9 points. AI crawlers 18.5%, down 8.0 points.

Lines reach Salience within seconds of Nginx writing them and show in reports within about fifteen minutes. Anomaly detection begins once about 24 hours of baseline has built.

Check that a crawler is who it says it is

Your log records what each client claimed to be, and that is all it is: a claim. Salience checks every claimed identity against the provider's own published address ranges, separating genuine Googlebot, Bingbot, GPTBot and ClaudeBot from the scrapers borrowing their names, and lists the impostors with the addresses responsible.

200+Crawler identities recognised, verified against published ranges where providers publish them

Bots and Crawlers on demo-site.example, last 24 hours: 15,541 bot requests, 12,233 verified, 655 failed verification, 2,653 other status. Served versus rejected: Googlebot 357 served, 34 rejected, Impersonators only, 0 verified · 34 unverified; Amazonbot 3,934 served, 16 rejected, The real bot, 16 verified · 0 unverified; Attack Path Probe 413 served, 104 rejected, Not verifiable, 0 verified · 104 unverified.

See traffic by route and endpoint

Nginx usually sits in front of something: an application, an API, a set of upstreams. Activity is broken down by route and URL pattern, so an endpoint starting to return 5xx, or an API path suddenly carrying ten times its usual traffic, is a named finding rather than a bump on a graph.

5 minDetection cycle on Starter plans and above

Status code detail for 4xx Client Error on demo-site.example, last 24 hours: Total Requests 3,272, % of All Traffic 9.58%, Unique Codes 4. Individual status codes: 403 2,337, 71.4% of 4xx; 404 896, 27.4% of 4xx; 405 29, 0.9% of 4xx; 499 10, 0.3% of 4xx. Top paths: /old-product-url 155, /blog/2019-relaunch 142, /guides/pricing-2025 119, /products/legacy 98, /sitemap-old.xml 90, /blog/page/48 42.

Import the logs you already have

Rotated and archived access logs upload directly, with format detection and deduplication against anything already streamed. Your baseline starts with real history rather than building from zero, and imports never count against your monthly request quota.

Import Logs on demo-site.example. Import jobs and current progress. Each job retains its own source dates. Import Historical Logs: Upload CloudFront or Apache/Nginx log files, or a log-analyser Events CSV, to analyse historical traffic data. Drag & drop log files, or click to browse (multiple files supported). Supported formats: CloudFront, Apache/Nginx, log-analyser Events CSV (.log, .txt, .csv, .gz, .zip). Supported formats: CloudFront standard/real-time logs, Apache/Nginx Combined Log Format, log-analyser Events CSV Auto-detection: We'll automatically detect the log format and parse the data Compressed files: .gz and .zip files are supported and will be decompressed automatically

How it works

Connect

Install the open-source Vector agent on the server and point it at the files your access_log directives already write. Guided instructions and a ready-made configuration are in the app; Nginx itself is untouched.

We analyse

Each line is classified against the crawler registry, verified against published provider ranges, grouped by route and section, and compared with your own history, sitemap, robots.txt and Search Console data.

Get answers

Dashboards, alerts by email, Slack or webhook, plain-English querying, an API and a CLI. The connection confirms within seconds, and the first reports fill within about fifteen minutes of the agent starting.

Specification

Collection method
The open-source Vector agent, tailing the access log you already write
Data freshness
Within seconds
Typical setup time
About 10 minutes
Plan requirement
Any server running Nginx that you control
Permissions needed
Root or sudo to install Vector, and read access to the log files
Code or DNS changes
No Nginx configuration changes and no DNS changes. An agent is installed on the server
Historical import
Yes. Rotated and archived access logs upload with deduplication
Key limitation
Access logs only: Nginx's error log is not ingested. Behind another proxy the log records the proxy's address unless real-IP handling is configured, and Salience reports what the log says.

Why not just use GoAccess, stub_status or grep?

They are good tools, and for their jobs they are the right ones. GoAccess gives you a genuinely useful real-time terminal dashboard for nothing, stub_status is the cheapest possible way to see connection state, and grep remains unbeatable when you already know exactly what you are looking for. On a single server, in the hands of someone comfortable at the command line, they cover a lot of ground. The difference shows up in three places: verification, memory, and being told rather than looking.

Parse and summarise the log

GoAccess, stub_status, grep
Yes, and quickly
Salience
Yes

Live connection and request rates

GoAccess, stub_status, grep
stub_status does this well
Salience
Request-level, with the clients named

Bot identity verified against published ranges

GoAccess, stub_status, grep
User agent taken at face value
Salience
Checked against official ranges, 200+ identities

Search and AI crawler interpretation

GoAccess, stub_status, grep
Counted as user-agent strings
Salience
Crawl budget, index context, training versus retrieval

Alerting when something changes

GoAccess, stub_status, grep
Not the design: you run the tool
Salience
16 detectors on a 5-minute cycle, each naming a next step

Baseline across weeks and months

GoAccess, stub_status, grep
Bounded by what logrotate kept
Salience
Retained per plan; archives import and deduplicate

Every server and site in one view

GoAccess, stub_status, grep
One host at a time
Salience
One organisation, one request model

When the native tooling is all you need

If you run one server, you live in the terminal, and your question is usually "what is happening right now" rather than "what changed this week and who needs to know", GoAccess and stub_status will serve you well and cost you nothing. Salience earns its place when the log has to answer to more than one person, across more than one machine, without anyone having to remember to look.

Facts about the integration

No customer logos and no five-star quotes on this page. These are properties of the product you can check on the free tier in an afternoon.

200+Crawler identities in the registry
16Alert detectors on your stream
5 minDetection cycle, Starter and above
SecondsFrom Nginx writing a line to it appearing

Illustrative, not a customer incident

An API route that normally serves a few hundred requests an hour starts serving forty thousand, all from one address rotating user agents, all returning 200. Request-rate graphs show a spike and no more than that. Against a five-minute baseline it is an alert in the first window, naming the route, the address and the fact that every request succeeded, which is the part worth knowing.

Everything included

One connection, one request stream. No per-feature setup and no second pipeline to maintain.

Verified bot and AI crawler identities

Claimed identities checked against official IP ranges where providers publish them; anything unverifiable is marked unverified rather than guessed at.

Default and custom log formats

The standard combined format works as written, and custom log_format directives are welcome. Nothing about your configuration needs to change.

Route and section analysis

Activity grouped by route, directory and URL pattern, so findings arrive with the endpoint named rather than as a site-wide total.

Error, latency and status analysis

2xx through 5xx per route, with spike detection against your own baseline rather than a fixed threshold.

Threat and probe detection

sqlmap-style requests, /.env and config fetches, credential-stuffing patterns and impersonation surges, escalated if anything returned a 200.

Alert detectors on a five-minute cycle

Traffic-drop alerts check the server is reachable before they fire, probe alerts check whether the flagged path really serves anything, and every alert is enriched first, so you never get "your server might be down" when it is not.

Historical import with deduplication

Rotated and archived logs upload with format detection, merge cleanly against streamed data, and never count against your quota.

Many servers, one account

Every Nginx host, and any Apache, Cloudflare, Vercel or CloudFront source, normalised to one request model in one organisation.

Alerts by email, Slack and webhook

Dashboards, email and Slack alerts, webhooks, a public API, a CLI, an MCP server, CSV exports and shared read-only dashboards.

Recommendations with a rule for Nginx

Addresses to block and fake crawler user agents, scored from the last 30 days of alerts, with an Nginx rule generated from the list and ready to paste.

Saved segments

Page groups you define by prefix, pattern or query string, with a one-click library of common groups, applied to all history and used in every report, alert and export.

Site checks every night

Twenty-one checks on crawler access, security hygiene and serving quality, each pass, warn or fail with the evidence, 30 days of history and an alert when a verdict changes.

Weekly report and daily digest

A weekly email report per site, a daily digest of lower-severity alerts, and email for anything above the severity you set.

Trust & data protection

Privacy and data protection

You are the controller

We process only on your instructions. GDPR Art. 28 DPA on every account, nothing to sign.

UK data residency

AWS eu-west-2 (London). Encrypted in transit (TLS 1.2+) and at rest (AES-256).

Server-side collection

No browser tracking script and no client-side pixel.

No sale, no pooling

Your logs are never sold, never used for advertising, never shared between customers. DPA, sub-processor list and security overview available.

What is collected

  • Timestamp, method, host and path
  • Status code and response size
  • Client address and user agent
  • Referrer

What is never collected

  • Nginx's error log
  • Request and response bodies
  • Response timing, unless your log format records it

Priced on requests, not seats, and not per server: connect as many Nginx hosts as you like on one plan. Start on the free tier with 500,000 requests a month and upgrade when your traffic does.

Crawler intelligence from $19/mo.

Priced on requests, not seats. Unlimited users on every plan except Solo. Start on the free tier and upgrade when your traffic does. Free trial, no card needed.

Prices in
Free$0
  • 500K requests/mo
  • 1 site
  • 30 days history
  • Unlimited users
  • Real-time analytics, bot and AI detection
Solo$19/mo
  • 5M requests/mo
  • 1 site (+2)
  • 6 months history
  • 1 seat
  • Sitemap and Search Console
Starter$49/mo
  • 20M requests/mo
  • 5 sites (+5)
  • 1 year history
  • Unlimited users
  • Real-time analytics with bot and AI-crawler verification
GrowthPopular$149/mo
  • 100M requests/mo
  • 15 sites (+15)
  • 2 years history
  • Unlimited users
  • AI allowance: ~600 answers or ~60 reports a month
Pro$499/mo
  • 500M requests/mo
  • 50 sites, no ceiling
  • 4 years history
  • Unlimited users
  • AI allowance: ~3,000 answers or ~300 reports a month
EnterpriseTalk to us
  • 1B requests/mo
  • Unlimited sites
  • Custom history
  • Unlimited users
  • SSO / SAML and audit log

Common questions

Do I have to change my Nginx configuration?

No. The standard combined format is supported as written and custom log_format directives are welcome. The agent reads the files your existing access_log directives already produce; Nginx is not modified and is not restarted.

My Nginx is behind another proxy. Will the client addresses be right?

They will be whatever your log records. Behind a load balancer or CDN, Nginx logs the proxy's address unless real-IP handling is configured, and if that is the case, Salience reports what the log says rather than guessing at the original client. It is worth checking before you connect; the setup guide covers it.

How long does setup take, and do I need a developer?

About ten minutes for someone with root or sudo on the server. The app generates a ready-made agent configuration, so the work is installing a package and pointing it at a file. If that needs to go to an engineer, you can delegate it from inside Salience without sharing your account.

Will the agent affect server performance?

It reads files and ships lines over HTTPS, which is light work on any modern server. It does not sit in the request path, so it cannot slow a response down or fail a request. If the agent stops, Nginx carries on exactly as before and you simply stop receiving new data.

Can I see response times?

Only if your log_format records them. Timing fields such as $request_time exist only where you have added them, so unless they are in your format, Salience will not report response times rather than inventing them. Everything else (status, route, client, user agent, size) is there by default.

Can I import the logs I already have?

Yes, and it is worth doing. Rotated and archived access logs upload with automatic format detection, deduplicate against anything already streaming, and do not count against your monthly request quota. Your baseline then starts with real history.

Does this cover the error log too?

No. Salience analyses the access log: the record of requests and what your server answered. Nginx's error log is a different file with a different purpose and is not ingested.

How is this different from GoAccess?

GoAccess parses and summarises the file you point it at, on demand, on one host. Salience verifies claimed bot identities against published address ranges, keeps a baseline across weeks and months, joins the log to your sitemap and Search Console, watches every server in one place, and tells you when something changes instead of waiting for you to look.

What happens to our data, and where is it stored?

You are the controller; Salience processes only on your instructions under a GDPR Art. 28 DPA that applies to every account. Data is stored encrypted in AWS eu-west-2 (London), never sold, never used for advertising and never pooled between customers.

Can we remove it later?

Stop the agent and collection stops immediately. Nothing was changed in Nginx, so there is nothing to unwind; uninstall the package and the server is exactly as it was.

Your logs already show what Google and the AI crawlers are doing.

Any server running Nginx, live in about ten minutes with no config change. Archived logs import too.