REST API برای لاگها
لاگها را از هر اپلیکیشن، زبان یا ابزاری با HTTPS بفرستید؛ تکبهتک یا دستهای.
لاگها را از هر اپلیکیشن، زبان یا فریمورکی با HTTPS بفرستید. هر درخواست در هدر x-api-key به یک کلید پروژه نیاز دارد: وقتی از سرور میفرستید کلید سرور (ab_srv_...)، و وقتی از اپ میفرستید کلید اپ (ab_live_...).
کلید اپ داخل اپهای موبایل و وب منتشر میشود، پس آن را عمومی در نظر بگیرید. روی سرورهای خودتان از کلید سرور در یک متغیر محیطی استفاده کنید و آن را از کد سمت کلاینت دور نگه دارید. هر دو کلید، صرفنظر از تنظیمات پروژه، روی دو endpoint زیر پذیرفته میشوند. کلید سرور و مسیرهای سرور را ببینید.
لاگها تا ۱ گیگابایت در ماه رایگان هستند؛ بیش از آن، هزینه از کیف پول: هر گیگابایت ۱۵٬۰۰۰ تومان. لاگها ۳۰ روز نگه داشته میشوند. قیمتها را ببینید.
ارسال یک لاگ#
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| message | string | بله | متن خط لاگ (تا ۱۰٬۰۰۰ نویسه نگه داشته میشود) |
| level | string | خیر | fatal، error، warn، info، debug یا trace (پیشفرض: info) |
| sourceId | string | خیر | شناسهی منبع لاگ (مثلاً "api-server"). پیشفرض: "<platform>-default" یا "unknown-default" |
| sourceName | string | خیر | نام خوانای منبع |
| timestamp | string | خیر | زمان با قالب ISO 8601 (پیشفرض: زمان دریافت) |
| metadata | object | خیر | جفتهای کلید-مقدار اضافه |
| platform | string | خیر | برچسب پلتفرم که در نمای Logs نشان داده میشود |
| environment | string | خیر | Environment (پیشفرض: production) |
| release | string | خیر | نسخهی release |
| userId | string | خیر | کاربری که لاگ به او مربوط است |
curl -X POST https://trace.abrova.ir/api/logs/ingest \
-H "x-api-key: $ABROVA_TRACE_SERVER_SECRET" \
-H "Content-Type: application/json" \
-d '{
"sourceId": "api-server",
"sourceName": "API Server",
"level": "info",
"message": "User login successful",
"metadata": {
"userId": "user_123",
"ip": "192.168.1.1"
}
}'پاسخ (201): {"status": "created", "id": 12345}
ارسال دستهای#
برای حجم بالای لاگ کارآمدتر است: چندین مورد را در یک درخواست، بهصورت آرایهی JSON زیر logs بفرستید. اینجا sourceId الزامی است؛ هر مورد در logs همان فیلدهای یک لاگ تکی را میپذیرد (بهجز sourceId / sourceName). از هر درخواست حداکثر ۱٬۰۰۰ مورد ذخیره میشود؛ بیشتر از آن را در چند دسته بفرستید.
curl -X POST https://trace.abrova.ir/api/logs/ingest/batch \
-H "x-api-key: $ABROVA_TRACE_SERVER_SECRET" \
-H "Content-Type: application/json" \
-d '{
"sourceId": "api-server",
"logs": [
{ "level": "info", "message": "Request received: GET /api/users" },
{ "level": "debug", "message": "Querying database..." },
{ "level": "info", "message": "Response sent: 200 OK (45ms)" }
]
}'پاسخ (201): {"status": "created", "count": 3, "projectId": "..."}
نمونه کدها#
Node.js
const ABROVA_TRACE_SERVER_SECRET = process.env.ABROVA_TRACE_SERVER_SECRET; // ab_srv_...
const ABROVA_TRACE_URL = 'https://trace.abrova.ir';
async function sendLog(sourceId, level, message, metadata = {}) {
await fetch(`${ABROVA_TRACE_URL}/api/logs/ingest`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': ABROVA_TRACE_SERVER_SECRET,
},
body: JSON.stringify({ sourceId, level, message, metadata }),
});
}
// Usage
sendLog('api-server', 'info', 'Server started on port 3000');
sendLog('api-server', 'error', 'Database connection failed', {
error: 'ECONNREFUSED',
});در اپهای Node.js، SDK برای Node.js ارسال دستهای و تلاش دوباره را برایتان انجام میدهد.
Python
import os
import requests
ABROVA_TRACE_SERVER_SECRET = os.environ.get('ABROVA_TRACE_SERVER_SECRET') # ab_srv_...
ABROVA_TRACE_URL = 'https://trace.abrova.ir'
def send_log(source_id, level, message, metadata=None):
requests.post(
f'{ABROVA_TRACE_URL}/api/logs/ingest',
json={
'sourceId': source_id,
'level': level,
'message': message,
'metadata': metadata or {},
},
headers={'x-api-key': ABROVA_TRACE_SERVER_SECRET},
timeout=5,
)
# Usage
send_log('worker', 'info', 'Job started')
send_log('worker', 'error', 'Job failed', {'job_id': '123'})Go
package main
import (
"bytes"
"encoding/json"
"net/http"
"os"
)
func sendLog(sourceId, level, message string, metadata map[string]interface{}) error {
body, _ := json.Marshal(map[string]interface{}{
"sourceId": sourceId,
"level": level,
"message": message,
"metadata": metadata,
})
req, _ := http.NewRequest("POST",
"https://trace.abrova.ir/api/logs/ingest",
bytes.NewBuffer(body))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-api-key", os.Getenv("ABROVA_TRACE_SERVER_SECRET"))
_, err := http.DefaultClient.Do(req)
return err
}PHP
در اپهای Laravel از کانال لاگ در SDK برای Laravel استفاده کنید. برای PHP ساده:
$ch = curl_init('https://trace.abrova.ir/api/logs/ingest');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'x-api-key: ' . getenv('ABROVA_TRACE_SERVER_SECRET'),
],
CURLOPT_POSTFIELDS => json_encode([
'sourceId' => 'shop-backend',
'level' => 'error',
'message' => 'payment callback timeout order=ORD-8812',
]),
]);
curl_exec($ch);
curl_close($ch);کدهای پاسخ#
- 201 — ساخته شد
- 400 — بدنهی درخواست نامعتبر است (
messageنیامده؛ در ارسال دستهای،logsخالی است یاsourceIdنیامده) - 401 — کلید نیامده یا نامعتبر است، یا ابرووا تریس برای پروژه فعال نیست
- 429 — درخواستها بیش از حد است. برای هر کلید و هر آدرس کلاینت سقف بالایی وجود دارد؛ کلاینتی که از آن بگذرد پاسخ
429با هدرRetry-After(به ثانیه) میگیرد. بهجای لاگ تکی دستهای بفرستید و پیش از تلاش دوباره صبر کنید. - 500 — خطای سرور؛ بعداً دوباره تلاش کنید.