Sample dataset · CC0

Access logs, already in columns.

Fourteen days of traffic with the eight columns a log analysis actually needs. Status codes follow a realistic mix, latency has a long right tail, and the user agent field contains commas so a naive split on comma produces garbage.

8 columns · 100 or 1,000 rows as a file · up to 1,000,000 rows generated here · CSV, JSON, JSONL, Excel, Parquet

Take a file

This is the widest and heaviest dataset in the collection per row, mostly because of the user agent column. The 1,000-row CSV is about 170 KB.

Log volumes that mean something

A hundred thousand log lines is a quiet hour on a real site and about 17 MB of CSV. A million is roughly a busy day and lands near 190 MB, which is the size at which the difference between a tool that streams and a tool that loads becomes obvious.

The first eight rows

The first eight rows of the 1,000-row file. Note the quoting around the paths that carry a query string.

request_tsipmethodpathstatusbytesresponse_msuser_agent
2026-06-01T00:00:00Z198.51.100.72GET/api/v1/rows2008309692Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15
2026-06-01T00:20:09Z198.51.100.216POST/api/v1/rows200242164Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36
2026-06-01T00:40:19Z203.0.113.150GET/pricing2005091716Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36
2026-06-01T01:00:28Z198.51.100.144POST/search?q=csv+to+json20054029181Mozilla/5.0 (X11; Linux x86_64; rv:127.0) Gecko/20100101 Firefox/127.0
2026-06-01T01:20:38Z203.0.113.197PUT/assets/app.css2002707562Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
2026-06-01T01:40:48Z198.51.100.168GET/blog2001039735Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15
2026-06-01T02:00:57Z203.0.113.42GET/favicon.ico2005205110Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
2026-06-01T02:21:07Z198.51.100.203GET/api/v1/export20024527358Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edg/126.0.0.0

Eight columns, and what each one holds

Column Type What it holds Example
request_ts timestamp UTC timestamp with a Z suffix, ascending through the file. 2026-06-01T00:00:00Z
ip text Client address, always inside 198.51.100.0/24 or 203.0.113.0/24, the ranges RFC 5737 reserves for documentation. 198.51.100.72
method text GET, POST, PUT, DELETE or HEAD, weighted the way real traffic is. GET
path text Request path, including a handful of query strings so the field needs quoting. /api/v1/rows
status integer HTTP status. Mostly 200, with a realistic sprinkle of 301, 304, 404, 429 and 500. 200
bytes integer Response size. 0 on 304 responses, as it should be. 83096
response_ms integer Server time in milliseconds, with a long right tail. 92
user_agent text Browser or bot string. Contains commas, so a naive splitter breaks on this column. Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15

What it models

A web access log after the parsing step, which is the form most people want and almost nobody publishes. Raw combined-format log lines are easy to find and annoying to work with; the interesting analysis starts once the line has been split into a timestamp, a client, a request, a response code, a size and a duration.

Fifteen paths appear, including two with query strings and three static assets. Methods are weighted toward GET the way real traffic is, with a tail of POST, PUT, DELETE and HEAD. The window is fourteen days and the rows ascend in time, so a requests-per-hour chart works without any preparation.

The commas inside the fields

User agent strings contain commas. So does one of the query strings. Both are correctly quoted in the CSV, which makes this file a compact test of whether a parser is a real CSV parser or a line splitter with ambitions. If your import produces nine or ten columns instead of eight, you have found the bug this dataset exists to find.

It is a common bug. Splitting on comma is the first thing anybody writes, it works on every clean sample file, and it breaks the first time a real log or a real address book arrives. Having a small file that exercises it in the first eight rows is worth more than a large clean file that never does.

Status codes and latency

About 86 percent of requests return 200, then 304, 301, 404, 429, 500 and 503 in decreasing order. That mix is close enough to a real site that an error rate chart looks familiar, and it includes 429 specifically because rate limiting is the status people forget to handle in a dashboard.

Response size is zero on every 304, which is correct and which catches a certain kind of bug in a bandwidth calculation. Response time is fast for most requests with a six percent tail that runs from 900 milliseconds to 14 seconds, so a mean latency and a 95th percentile latency tell you very different stories. Comparing the two on this file is a good way to explain to somebody why the mean is the wrong number to alert on.

What people use it for

  • Proving a CSV parser handles quoted fields containing commas.
  • Percentile work: the difference between mean and p95 latency is stark here.
  • Error rate dashboards with a realistic status code mix, including 429.
  • Requests per hour and per path time series over a fourteen-day window.
  • Large-file performance testing, since this is the heaviest dataset per row.

License, and the people in it

This dataset is dedicated to the public domain under CC0 1.0. Put it in a course, a paid product, a test suite, a bug report, a screenshot, a conference talk or a book. There is nothing to ask for, nothing to sign and no attribution required. A link back is welcome and is not a condition.

The addresses in the ip column are all inside 198.51.100.0/24 and 203.0.113.0/24, the two ranges RFC 5737 reserves for documentation. They route nowhere and belong to nobody. There are no session identifiers, no cookies and no user names in this file.

Questions people ask about this file

Are the IP addresses real?

No, and they cannot be. Every address is inside 198.51.100.0/24 or 203.0.113.0/24, the two blocks RFC 5737 reserves for documentation and examples. They are not routable and they are not assigned to anybody, so nothing in this file can be traced to a real client and no address here will ever appear in a real firewall rule by accident.

Why does the user agent column have commas in it?

Because real user agent strings do, and it is the fastest way to find out whether something is a CSV parser or a comma splitter. The field is correctly quoted, so a compliant parser reads eight columns. Anything that reads nine or ten has the bug, and it is better to find that on a 1,000-row sample than on a production log.

Why is bytes zero on some rows?

Because those rows are 304 Not Modified responses, and a 304 carries no body. It is correct rather than missing, and it is a small trap for bandwidth calculations that assume every response has a size. Treating the zero as a null, or filtering it out, both give the wrong total.

How big does the million-row version get?

About 190 MB of CSV, which makes this the heaviest dataset in the collection. It is generated in your browser rather than downloaded, so nothing crosses the network, but it is worth knowing before you press the button. If you only want to test large-file handling, the sales dataset reaches a million rows in about 55 MB.