Phân tích log máy chủ API
Phân tích access log nginx / Apache (combined, common, log_format tuỳ chỉnh), syslog và JSON lines thành bảng, thống kê IP, URL, mã lỗi, bot.
Gửi log qua log dạng văn bản, body text/plain hoặc file multipart (tối đa 200.000 dòng). format được tự nhận diện: combined và common (mặc định của nginx / Apache), syslog (RFC 3164 và RFC 5424) hoặc json (mỗi dòng một đối tượng JSON, nhận các tên trường phổ biến như remote_addr, status, request, httpRequest.status). Với định dạng riêng, truyền chuỗi log_format của nginx ($remote_addr … "$request" $status … $request_time) hoặc LogFormat của Apache (%h %l %u %t "%r" %>s %b %D).
Mỗi dòng kết quả có các trường đã tách cùng time (ISO 8601 UTC), method, path, protocol, và với bot là bot cùng nhóm bot AI. stats gồm khoảng thời gian, số request theo giờ, phút cao điểm, số IP, dung lượng, mã trạng thái và nhóm mã, số lỗi 4xx / 5xx kèm URL lỗi nhiều nhất, top IP, URL, referrer, user agent, trình duyệt và hệ điều hành (ua-parser-js), số request từ bot và crawler AI (danh sách ai.robots.txt); với syslog: mức độ, facility, host và ứng dụng.
Lọc bằng status (404, 4xx, 5xx), chọn số dòng trả về limit (mặc định 500, tối đa 10.000; thống kê luôn tính trên toàn bộ) và độ dài danh sách top. Dòng syslog RFC 3164 không có năm: đặt year. Dòng không khớp được đếm trong failed kèm số dòng.
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
log | body | string | không | Nội dung log (hoặc gửi body text/plain hay file multipart). | |
file | body | file | không | File log tải lên. | |
format | body|query | string | không | auto | auto, combined, common, syslog, json (hoặc nginx / apache kèm log_format). |
log_format | body|query | string | không | Chuỗi log_format của nginx hoặc LogFormat của Apache cho định dạng riêng. | |
status | body|query | string | không | Chỉ giữ một mã (404) hoặc nhóm mã (4xx, 5xx). | |
limit | body|query | number | không | 500 | Số dòng đã phân tích trả về (0-10.000). |
top | body|query | number | không | 10 | Độ dài các danh sách top (1-100). |
year | body|query | number | không | current year | Năm cho dòng syslog RFC 3164 (định dạng này không có năm). |
Ví dụ
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));Kết quả trả về
{
"format": "combined",
"lines": 7,
"parsed": 6,
"failed": 1,
"failed_lines": [
7
],
"truncated_input": false,
"stats": {
"time_range": {
"from": "2026-11-11T01:15:02.000Z",
"to": "2026-11-11T01:16:46.000Z"
},
"requests_per_hour": {
"2026-11-11T01:00Z": 6
},
"peak_minute": {
"minute": "2026-11-11T01:16Z",
"count": 4
},
"average_per_minute": 2.2,
"unique_ips": 4,
"bytes_sent": 26039,
"status_classes": {
"2xx": 3,
"3xx": 1,
"4xx": 1,
"5xx": 1
},
"status_codes": {
"200": 3,
"302": 1,
"404": 1,
"502": 1
},
"errors_4xx": 1,
"errors_5xx": 1,
"methods": {
"GET": 5,
"POST": 1
},
"top_ips": [
{
"ip": "203.0.113.5",
"count": 2
},
{
"ip": "198.51.100.7",
"count": 2
},
"…"
],
"top_paths": [
{
"path": "/san-pham/ao-thun",
"count": 1
},
"…"
],
"top_4xx": [
{
"request": "404 /wp-login.php",
"count": 1
}
],
"top_5xx": [
{
"request": "502 /api/orders",
"count": 1
}
],
"browsers": [
{
"browser": "Chrome",
"count": 2
}
],
"bot_requests": 4,
"top_bots": [
{
"bot": "Googlebot",
"count": 1
},
{
"bot": "GPTBot",
"count": 1
},
{
"bot": "python-requests",
"count": 1
},
"…"
],
"ai_bots": [
{
"bot": "GPTBot (training)",
"count": 1
}
],
"…": "…"
},
"rows_returned": 1,
"rows": [
{
"remote_addr": "203.0.113.5",
"ident": null,
"remote_user": null,
"time_local": "11/Nov/2026:08:15:02 +0700",
"request": "GET /san-pham/ao-thun?page=2 HTTP/1.1",
"status": 200,
"body_bytes_sent": 5120,
"http_referer": "https://www.google.com/",
"http_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) … Chrome/130.0.0.0 Safari/537.36",
"time": "2026-11-11T01:15:02.000Z",
"method": "GET",
"path": "/san-pham/ao-thun?page=2",
"protocol": "HTTP/1.1"
}
]
}
Ứng dụng
- Tìm các URL trả về lỗi 404 hoặc 5xx sau khi triển khai
- Xem bot và crawler AI nào (GPTBot, ClaudeBot…) truy cập site và tần suất
- Chuyển access log nginx sang JSON để đưa vào bảng tính hoặc công cụ BI
- Phát hiện IP lạm dụng và đỉnh request theo phút khi có sự cố
Hỏi đáp
nginx của tôi dùng log_format tuỳ chỉnh, có được không?
Được. Dán chuỗi log_format (phần sau tên định dạng) vào log_format; mỗi $biến trở thành một trường cùng tên. Các chỉ thị LogFormat của Apache (%h, %t, %r, %>s, %b, %D, %{User-Agent}i…) cũng được hỗ trợ.
Log tối đa bao lớn?
Theo giới hạn dung lượng file của gói và tối đa 200.000 dòng không rỗng mỗi yêu cầu. Hãy chia nhỏ hoặc lọc log lớn (ví dụ theo ngày) trước.
Bot được nhận diện thế nào?
User agent được so với danh sách crawler AI của ai.robots.txt và các mẫu bot / crawler / HTTP client phổ biến; user agent còn lại được nhóm theo trình duyệt và hệ điều hành bằng ua-parser-js.
API liên quan
Tạo UUID
Sinh tối đa 1.000 UUID v4, UUID v7 theo thời gian, ULID, Nano ID hoặc mã hex ngẫu nhiên mỗi request. Ngẫu nhiên an toàn, hỗ trợ chữ in hoa.
⏱Phân tích biểu thức cron
Kiểm tra biểu thức cron và xem các lần chạy tiếp theo theo múi giờ bất kỳ, kèm mô tả dễ hiểu. Hỗ trợ cú pháp cron 5, 6 và 7 trường.
🕒Giờ & múi giờ
Lấy giờ hiện tại ở mọi múi giờ, đổi giữa các múi giờ và Unix timestamp (giây hoặc mili giây), kèm độ lệch UTC và thứ trong tuần cho tối đa 30 múi giờ.