Private log analyzer · Nothing uploaded

See what they are probing.
Check if you actually exposed it.

Drop in an access log. xlogs finds repeated probes, the paths people are hunting for, and any secret written into the log itself. Then it compares those requests against your live deployment, so you learn not just that someone asked for your environment file, but whether you were serving it.

Entirely privateYour log never leaves your browser
Works offlineOnce this page has loaded, nothing is sent
Common formatsApache, nginx, Vercel, Cloudflare, JSON lines
Drop your access log here
or choose a file
These five are the formats the parser reads. Anything else is shown as unparsed lines rather than guessed at.
ApachenginxVercelCloudflareJSON Lines
Nothing is uploaded to xlogs. Your log stays on your device.
Where do I get my log?Vercel, Cloudflare, nginx, Apache

No account. No signup. Nothing stored.

How xlogs logs works

1

You drop a log

It is read in this tab by your own browser. The file does not move.

2

We find what was probed

Repeated requests, the paths people hunt for, and any secret written into the log itself.

3

We check what you serve

Optionally scan your live deployment and line the two up, so a request becomes a verdict.

Probed and exposedWorth acting on today
Probed, not exposedThe scan could not retrieve it
Exposed, not seen hereReachable, nobody has tried yet

A worked example

This is real output from a sample log, computed by the code above rather than written here. Drop your own file and the same functions produce the same shape of answer.

What was asked for, and whether it is served

Each row pairs the log against a scan of the same deployment.

/.env40 requests from 5 addressesProbed and exposed
.git6 requests from 3 addressesProbed, not exposed
WordPress2 requests from 1 addressProbed, not exposed
Admin panel1 request from 1 addressProbed, not exposed
Database admin1 request from 1 addressProbed, not exposed
/assets/index.js.mapnot requested in this logExposed, not seen here

The scan half of this example is a fixture too, so the whole thing is reproducible. Your own run scans your real deployment.

Your log stays privatexlogs reads the file in your browser. It is not uploaded, not stored on a server, and not written to a database. If you use the join, the only thing sent is the URL you type.How we keep it privateNo upload endpoint exists in this codebaseParsing runs in your browser, not on a serverOnly a URL is sent, and only if you run the joinClosing the tab discards everythingLearn more

Open the network tab and drop a file. Nothing is sent. That is not a configuration choice we could quietly reverse: there is no upload endpoint in this codebase to point at, so there is no retention policy to read, no region to pick, no breach that could expose a log you analysed here, and nothing to delete afterwards.

It costs you something real, and it is worth being clear about what. The large log platforms hold months of history from every service you run and let you search it later. This holds one file for as long as the tab is open. If you need searchable history across a fleet, you need one of those. If you want to know what your access log says this afternoon, you do not need to ship it to anyone first.

Need help getting your log?

Find instructions for your platform.

Vercel

Open your project, then the Logs tab. Or run `vercel logs <deployment>` in a terminal.

Full access logs need a Log Drain, which is a paid plan feature. Runtime logs are available on any plan.

Cloudflare

Analytics and Logs, then Logs. Logpush delivers them to storage you control.

Logpush is an Enterprise feature. The dashboard shows a live tail on lower plans.

nginx

`/var/log/nginx/access.log`, or wherever `access_log` points in your config.

Apache

`/var/log/apache2/access.log` on Debian and Ubuntu. `/var/log/httpd/access_log` on RHEL.

Other platformsView all

Any host that can export request logs works. Look for an access log, request log or Logpush or log drain export, in Common or Combined format or JSON per line.

If your export is a format this does not recognise, the lines are still grouped as message patterns rather than discarded.

Is my log file uploaded anywhere?

No. The file is read by your browser and parsed by JavaScript running in the tab. There is no upload endpoint, nothing is written to storage, and closing the tab discards everything. If you use the join feature, the only thing sent to us is the URL you type, never any part of the log.

Which log formats work?

Apache and nginx Common and Combined formats, and JSON-per-line as emitted by Vercel, Cloudflare and most modern platforms. Lines that match none of those are not discarded: they are grouped as message patterns instead, so an application log is still useful here.

What is the join?

Your log shows which paths people are requesting. A scan shows which paths your app actually serves. Holding both at once produces something neither can say alone: not just that someone asked for your environment file, but that you are serving it. Log analytics tools never scanned your app, and scanners have no idea who has been knocking.

How big a file can it handle?

It reads up to 200,000 lines. Past that it stops and says exactly how many lines it read out of how many the file contains, because a partial read reported as a complete one would be worse than useless.

Do you use AI to analyse the log?

No. Every number here comes from counting and pattern matching, so the same log always produces the same result and you can verify any figure by hand. Patterns are formed by masking the parts that vary, such as ids and timestamps, and grouping what is left.