nginx & Apache Access Log Analyzer
Parse nginx / Apache access logs (combined, common, custom log_format), syslog and JSON lines into rows with top IPs, paths, status codes and bots.
Result
Press “Run” to see the result.
Send the log as log text, a text/plain body or a multipart file (up to 200,000 lines). The format is detected automatically: combined and common (nginx / Apache defaults), syslog (RFC 3164 and RFC 5424) or json (one JSON object per line, with common field names such as remote_addr, status, request, httpRequest.status). For a custom layout pass your nginx log_format string ($remote_addr … "$request" $status … $request_time) or Apache LogFormat (%h %l %u %t "%r" %>s %b %D).
Each row has the parsed fields plus time (ISO 8601 UTC), method, path, protocol and, for bots, bot and the AI bot category. stats contains the time range, requests per hour, peak minute, unique IPs, bytes, status codes and classes, 4xx / 5xx counts with the top failing paths, top IPs, paths, referrers and user agents, browsers and OS (ua-parser-js), bot requests and AI crawlers (ai.robots.txt list); for syslog: severities, facilities, hosts and apps.
Filter with status (404, 4xx, 5xx), choose limit rows to return (default 500, max 10,000; stats always cover all lines) and top list size. RFC 3164 syslog lines have no year: set year. Lines that do not match are counted in failed with their line numbers.
Use this in your code
curl -X POST "https://apibox.io.vn/v1/log-parse" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"log":"203.0.113.5 - - [11/Nov/2026:08:15:02 +0700] \"GET /san-pham/ao-thun?page=2 HTTP/1.1\" 200 5120 \"https://www.google.com/\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36\"\n66.249.66.1 - - [11/Nov/2026:08:16:00 +0700] \"GET /robots.txt HTTP/1.1\" 200 120 \"-\" \"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\"\n…","limit":1}'const res = await fetch('https://apibox.io.vn/v1/log-parse', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"log": "203.0.113.5 - - [11/Nov/2026:08:15:02 +0700] \"GET /san-pham/ao-thun?page=2 HTTP/1.1\" 200 5120 \"https://www.google.com/\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36\"\n66.249.66.1 - - [11/Nov/2026:08:16:00 +0700] \"GET /robots.txt HTTP/1.1\" 200 120 \"-\" \"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\"\n…",
"limit": 1
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/log-parse",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"log": "203.0.113.5 - - [11/Nov/2026:08:15:02 +0700] \"GET /san-pham/ao-thun?page=2 HTTP/1.1\" 200 5120 \"https://www.google.com/\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36\"\n66.249.66.1 - - [11/Nov/2026:08:16:00 +0700] \"GET /robots.txt HTTP/1.1\" 200 120 \"-\" \"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\"\n…", "limit": 1},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/log-parse');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"log":"203.0.113.5 - - [11/Nov/2026:08:15:02 +0700] \\"GET /san-pham/ao-thun?page=2 HTTP/1.1\\" 200 5120 \\"https://www.google.com/\\" \\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36\\"\\n66.249.66.1 - - [11/Nov/2026:08:16:00 +0700] \\"GET /robots.txt HTTP/1.1\\" 200 120 \\"-\\" \\"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\\"\\n…","limit":1}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));API documentation → Get a free API key
FAQ
My nginx uses a custom log_format. Is it supported?
Yes. Paste the log_format string (the part after the format name) in log_format; every $variable becomes a field of the same name. Apache LogFormat directives (%h, %t, %r, %>s, %b, %D, %{User-Agent}i…) work too.
How big can the log be?
Up to your plan’s file size limit and 200,000 non-empty lines per request. Split bigger logs or filter them (e.g. one day) first.
How are bots detected?
User agents are matched against the ai.robots.txt list of AI crawlers and common bot / crawler / HTTP-client patterns; other user agents are grouped by browser and OS with ua-parser-js.