Free Caddy Log Analyzer

Caddy logs every request as a line of JSON. Paste that file here and read it as a proper dashboard instead.

100% Client-Side
Nothing Gets Uploaded
Instant Results

Built for Caddy's JSON format

Caddy does not use the old text log format by default. Every request comes out as a structured JSON object with the method, URI, status, response size, client IP, and the request headers all nested inside. That is great for machines and painful to read. This tool knows that shape. It pulls the method and path out of the request object, reads the User-Agent out of the headers array, and turns the whole file into charts.

How it works

  1. Pull the access log off your server, or open the file you already have.
  2. Paste the JSON in, or drop the file onto the analyzer on the home page.
  3. Read the dashboard instead of squinting at raw JSON.

Turning on access logging in Caddy

Caddy does not write requests to a file until you ask it to. Add a log block to your site in the Caddyfile and point it at a file:

example.com { log { output file /var/log/caddy/access.log } }

Reload with caddy reload and Caddy starts writing one JSON object per request. That file is exactly what this analyzer expects.

Nothing leaves your browser

Your access log knows who visited and what they asked for. That is not data you want to hand to a random web service. So this one does not ask for it. The JSON gets parsed right in the tab using JavaScript, no upload, no server, no login. Shut the tab and it is gone. Open dev tools and watch the network stay quiet if you want proof.

What a line looks like

Each line in your access log is one JSON object, roughly like this:

{"ts":1680000000.12,"logger":"http.log.access","request":{"client_ip":"10.0.0.1","method":"GET","uri":"/","headers":{"User-Agent":["Mozilla/5.0"]}},"status":200,"size":2326}

Startup messages and other non-request lines in the same file are skipped, so you can paste a raw log without cleaning it up first. Running nginx or Apache somewhere too? Those formats work here as well.

What the dashboard shows

  • Requests over time, so traffic spikes and quiet stretches are easy to spot.
  • Top URLs and top client IPs, so you know what is popular and who is hammering you.
  • A status code breakdown that makes a run of 404s or 502s jump out.
  • Bandwidth totals read from the size field.
  • Referrers, browsers, and operating systems from the user agent.
  • Bots split out from real people, plus a list of requests that look like attacks.

Spot the bots and the probes

A lot of traffic to any public site is automated. The analyzer separates known crawlers, search engines, and AI scrapers from actual people so your visitor count means something. It also marks the requests that look like attacks: admin panel scans, path traversal, SQL injection, hits against .git or .env. The bad bot detection guide covers how it decides, and the status code reference explains the response codes you will see.

Caddy log analyzer FAQ

Is it free?

Yes, with no account and no limits.

Is my log sent to a server?

No. The JSON is parsed in your browser, so the real client IPs in a production log never leave your machine.

Does it read Caddy's JSON logs specifically?

Yes. It understands the nested request object, the headers array, and the epoch timestamp Caddy writes, so you paste the file as is.

What if the file mixes access logs with other Caddy logs?

Lines that are not HTTP access entries are skipped automatically, so a raw log with startup and error lines still works.