لاگگیری با SDK Node.js
لاگگیری سمت سرور برای Node.js با تلاش مجدد با فاصلهی افزایشی، بدون وابستگی و یکپارچگی با Express.js.
لاگگیری سمت سرور با تلاش مجدد با فاصلهی افزایشی (exponential backoff)، بدون هیچ وابستگی و با یکپارچگی Express.js. لاگها در ابرووا تریس › Logs نمایش داده میشوند و از AbrovaTrace.captureMessage() جدا هستند؛ آن متد به بخش Messages میرود.
دستهای که ارسالش ناموفق باشد بعد از ۲ ثانیه ← ۴ ثانیه ← ۸ ثانیه ← ... تا حداکثر ۶۰ ثانیه دوباره ارسال میشود. بعد از ۱۰ تلاش ناموفق، لاگها تا لاگ بعدی یا flush بعدی در بافر میمانند.
پیشفرض ۱۰۰۰ لاگ. وقتی از این حد بگذرد، قدیمیترین لاگها حذف میشوند تا حافظه پر نشود.
تابع setTimeout فقط وقتی اجرا میشود که بافر لاگ داشته باشد. در حالت بیکار هیچ بار پردازشی ندارد.
از ماژولهای داخلی http/https خود Node.js استفاده میکند. هیچ پکیج خارجی لازم نیست.
نصب#
رجیستری ابرووا را به .npmrc اضافه کنید و سپس نصب کنید (نگاه کنید به SDK Node.js):
# .npmrc @abrova-trace:registry=https://center.abrova.ir/api/packages/abrova/npm/
npm install @abrova-trace/nodejs-sdk
استفادهی پایه#
const { LogService, LogLevel } = require('@abrova-trace/nodejs-sdk');
const logger = new LogService({
apiKey: 'ab_live_your_api_key',
sourceId: 'api-server',
sourceName: 'My API Server',
environment: 'production',
});
logger.log('Server started on port 3000', LogLevel.INFO);
logger.log('Database connection slow', LogLevel.WARN, { latency: 2500 });
logger.log('Failed to process payment', LogLevel.ERROR, { orderId: '12345' });
// Graceful shutdown
process.on('SIGTERM', async () => {
await logger.dispose();
process.exit(0);
});اگر از قبل AbrovaTrace.init() را صدا میزنید، بهجای ساختن یک LogService میتوانید از همان برای لاگگیری استفاده کنید. این روش کلید API، environment و release را از init() برمیدارد و کاربری را که با setUser() تنظیم کردهاید به لاگها پیوست میکند:
const AbrovaTrace = require('@abrova-trace/nodejs-sdk');
AbrovaTrace.enableLogging({ sourceId: 'api-server', sourceName: 'My API Server' }); // flushes every 5s by default
AbrovaTrace.info('Server started on port 3000');
AbrovaTrace.warn('Database connection slow', { latency: 2500 });
AbrovaTrace.logError('Failed to process payment', { orderId: '12345' });
// also: trace(), logDebug(), fatal(), log(message, level, metadata)
await AbrovaTrace.flushLogs(); // sends buffered logs nowپیش از بسته شدن پروسه، await AbrovaTrace.flush() را صدا بزنید. این متد لاگهای بافرشده را همراه با خطاها، پیامها و spanهای عملکرد در انتظار میفرستد و اگر زمان انتظارش (پیشفرض: ۵۰۰۰ میلیثانیه) زودتر تمام شود، مقدار false برمیگرداند. متد AbrovaTrace.close() هم لاگهای بافرشده را میفرستد و سپس SDK را ریست میکند.
سطحهای لاگ#
const { LogLevel } = require('@abrova-trace/nodejs-sdk');
logger.log('Detailed trace info', LogLevel.TRACE);
logger.log('Debug information', LogLevel.DEBUG);
logger.log('User action completed', LogLevel.INFO);
logger.log('Approaching rate limit', LogLevel.WARN);
logger.log('Failed to save data', LogLevel.ERROR);
logger.log('App crashed unexpectedly', LogLevel.FATAL);یکپارچگی با Express.js#
const express = require('express');
const { LogService, LogLevel } = require('@abrova-trace/nodejs-sdk');
const app = express();
const logger = new LogService({
apiKey: 'ab_live_your_api_key',
sourceId: 'express-api',
environment: process.env.NODE_ENV || 'development',
});
// Request logging middleware
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
const level = res.statusCode >= 400 ? LogLevel.ERROR : LogLevel.INFO;
logger.log(`${req.method} ${req.path} ${res.statusCode}`, level, {
method: req.method,
path: req.path,
statusCode: res.statusCode,
duration,
});
});
next();
});
// Error logging middleware
app.use((err, req, res, next) => {
logger.log(err.message, LogLevel.ERROR, {
stack: err.stack,
path: req.path,
});
res.status(500).json({ error: 'Internal Server Error' });
});متادیتا و اطلاعات کاربر#
// Structured metadata
logger.log('Order placed', LogLevel.INFO, {
orderId: 'ORD-12345',
amount: 4500000,
currency: 'IRR',
});
// Associate logs with a user (4th parameter)
logger.log('Payment declined', LogLevel.ERROR, {
reason: 'insufficient_funds',
}, 'user_abc123');عملیات دستی#
// Force flush all buffered logs
await logger.flush();
// Check buffer status
console.log('Pending logs:', logger.bufferSize);
// Dispose when shutting down (flushes remaining logs)
await logger.dispose();پیکربندی#
const logger = new LogService({
apiKey: 'ab_live_your_api_key', // Required
serverSecret: process.env.ABROVA_SERVER_SECRET, // Optional: ab_srv_..., sent with every request
sourceId: 'api-server', // Needed for batch sending (without it, logs are sent one by one)
sourceName: 'My API Server', // Optional display name
platform: 'nodejs', // Default: 'nodejs'
environment: 'production', // 'development', 'staging', 'production'
release: '1.2.3', // Optional app version
batchSize: 50, // Flush when buffer reaches this size
flushIntervalMs: 30000, // Max time before flush (default: 30000)
maxBufferSize: 1000, // Drop oldest logs when exceeded
debug: false, // Enable console debug output
});| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| apiKey | string | بله | کلید API پروژهی شما |
| serverSecret | string | خیر | کلید سرور شما (ab_srv_xxx) که با هر درخواست لاگ فرستاده میشود؛ آن را فقط روی سرور نگه دارید |
| apiUrl | string | خیر | آدرس پایهی API تریس؛ فقط برای API تریس خودمیزبان تنظیمش کنید (پیشفرض: "https://trace.abrova.ir") |
| sourceId | string | خیر | شناسهی منبع (مثلاً "api-server"). بدون آن، هر لاگ با یک درخواست جدا فرستاده میشود و ارسالهای ناموفق دوباره امتحان نمیشوند |
| sourceName | string | خیر | نام نمایشی خوانا برای این منبع |
| platform | string | خیر | شناسهی پلتفرم (پیشفرض: "nodejs") |
| environment | string | خیر | نام محیط (پیشفرض: "production") |
| release | string | خیر | شناسهی نسخهی اپ |
| batchSize | number | خیر | وقتی بافر به این اندازه برسد flush میشود (پیشفرض: ۵۰) |
| flushIntervalMs | number | خیر | حداکثر زمان تا flush به میلیثانیه (پیشفرض: ۳۰۰۰۰) |
| maxBufferSize | number | خیر | با گذشتن از این حد، قدیمیترین لاگها حذف میشوند (پیشفرض: ۱۰۰۰) |
| debug | boolean | خیر | نمایش خروجی دیباگ در کنسول (پیشفرض: false) |
توصیهها#
برای sourceId مقدارهای معنادار بگذارید تا منبع لاگها در داشبورد مشخص باشد
همیشه روی SIGTERM/SIGINT متد dispose() را صدا بزنید تا لاگهای باقیمانده فرستاده شوند (اگر از طریق AbrovaTrace لاگ میگیرید، AbrovaTrace.flush() را)
middleware لاگ درخواستها را در ابتدای pipeline اکسپرس اضافه کنید
middleware لاگ خطا را بعد از همهی routeها اضافه کنید تا همهچیز را پوشش دهد
متادیتای ساختاریافته (شناسهها، مدتزمانها، مسیرها) بفرستید تا فیلتر کردن سادهتر شود
شناسهی کاربر را به لاگها بدهید تا دیباگ مشکلات مخصوص یک کاربر سادهتر شود