تسجيل الدخول لجافا سكريبت (Node.js): أفضل الحلول
تسجيل الدخول هو أساس مراقبة وتصحيح أي تطبيق ويب. في عالم Node.js، توجد عدة مكتبات ناضجة وشائعة تتيح لك ضبط جمع وتنسيق وتخزين السجلات بمرونة. في هذه المقالة، سنستعرض أربعة من أفضل الحلول: Winston، Pino، Bunyan و Morgan. ستتعرف على ميزاتها ونقاط قوتها وستحصل على أمثلة عملية لاستخدامها.
لماذا نحتاج إلى تسجيل الدخول في Node.js؟
على عكس جافا سكريبت في المتصفح، يعمل تطبيق الخادم دون وصول مباشر إلى وحدة تحكم المطور. تتيح السجلات ما يلي:
- تتبع الأخطاء والاستثناءات في الوقت الفعلي.
- تحليل الأداء (وقت الاستجابة، الطلبات).
- تسجيل أحداث التدقيق (دخول المستخدم، تغيير البيانات).
- التكامل مع أنظمة المراقبة الخارجية (ELK، Datadog، Splunk).
1. Winston — المعيار العالمي
Winston هي أشهر مكتبة تسجيل دخول لـ Node.js. ميزتها الرئيسية هي الناقلات (أين تكتب السجلات) و التنسيقات (كيفية عرضها).
التثبيت:
npm install winstonمثال على الإعداد الأساسي:
const winston = require('winston');
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'combined.log' }) ]});
logger.info('الخادم يعمل على المنفذ 3000');logger.error('خطأ في الاتصال بقاعدة البيانات', { db: 'main' });الإمكانيات الرئيسية:
- دعم ناقلات متعددة (وحدة التحكم، ملف، HTTP، MongoDB، Elasticsearch).
- تنسيقات مخصصة (JSON، نص عادي، مع طوابع زمنية).
- تصفية حسب المستوى (error، warn، info، verbose، debug، silly).
- إنشاء مسجلات فرعية لوحدات مختلفة.
متى تختاره: للمشاريع المعقدة التي تتطلب توجيهًا مرنًا للسجلات وتكاملًا مع الخدمات الخارجية.
2. Pino — مسجل فائق السرعة
Pino مصمم لأقصى أداء. إنه أسرع من Winston بمقدار 5-10 مرات بفضل استخدام JSON المنظم وتقليل النفقات العامة.
التثبيت:
npm install pinoمثال على الاستخدام:
const pino = require('pino');
const logger = pino({ level: 'info', transport: { target: 'pino-pretty', // لإخراج جميل في وحدة التحكم options: { colorize: true } }});
logger.info({ user: 42 }, 'المستخدم دخل إلى النظام');logger.error(new Error('فشل تحميل الملف'));الميزات:
- استهلاك ضئيل لوحدة المعالجة المركزية والذاكرة.
- دعم مدمج لـ
pino-prettyللتطوير. - العمل مع التدفقات (streams) للتكامل مع أدوات أخرى.
- تسلسل تلقائي للكائنات دون فقدان الأداء.
متى تختاره: للتطبيقات عالية التحميل (API، الخدمات المصغرة)، حيث كل ملي ثانية مهمة.
3. Bunyan — سجلات منظمة من مبتكري Joyent
Bunyan من شركة Joyent (مبتكري Node.js) يركز على هيكل صارم للسجلات. كل رسالة هي كائن JSON مع حقول إلزامية (hostname، pid، time).
التثبيت:
npm install bunyanمثال:
const bunyan = require('bunyan');
const logger = bunyan.createLogger({ name: 'myapp', streams: [ { level: 'info', stream: process.stdout }, { level: 'error', path: 'error.log' } ]});
logger.info('تم بدء تشغيل التطبيق');logger.error({ err: new Error('فشل الاتصال') }, 'خطأ في قاعدة البيانات');الميزات الرئيسية:
- تنسيق JSON صارم مع حقول إلزامية.
- أداة سطر أوامر مدمجة
bunyanلتنسيق السجلات وترشيحها. - دعم الحلقات (rings) لتجميع السجلات ذات الصلة.
- إخراج سهل القراءة مع تلوين بناءً على المستوى.
متى تختاره: للمشاريع التي تتطلب تحليلاً عميقًا للسجلات ومعايير صارمة للهيكل.
4. Morgan — مسجل طلبات HTTP
Morgan هو وسيط (middleware) متخصص لتسجيل طلبات HTTP في Express.js. إنه مثالي لتتبع الطلبات الواردة وأكواد الاستجابة وأوقات المعالجة.
التثبيت:
npm install morganمثال على الاستخدام مع Express:
const express = require('express');const morgan = require('morgan');
const app = express();
app.use(morgan('combined')); // تنسيق Apache القياسي
app.get('/', (req, res) => { res.send('مرحباً بالعالم!');});
app.listen(3000);التنسيقات المدمجة:
combined— تنسيق Apache القياسي مع معلومات مفصلة.common— تنسيق Apache المبسط.dev— تنسيق ملون للتطوير مع أكواد الحالة.shortوtiny— تنسيقات موجزة.
متى تختاره: لتطبيقات Express.js حيث تحتاج إلى تتبع الطلبات بسرعة دون إعداد معقد.
الخلاصة: أي مكتبة تختار؟
اختيار المكتبة يعتمد على احتياجات مشروعك:
- Winston — الخيار الأفضل للمشاريع المعقدة ذات متطلبات تسجيل الدخول المتنوعة.
- Pino — مثالي للأنظمة عالية الأداء حيث السرعة هي الأولوية.
- Bunyan — مناسب للفرق التي تقدر الهيكل الصارم وأدوات التحليل القوية.
- Morgan — لا غنى عنه لتسجيل طلبات HTTP في Express.js.
في الممارسة العملية، غالبًا ما يتم الجمع بين هذه المكتبات: على سبيل المثال، استخدام Morgan للطلبات و Winston أو Pino لسجلات التطبيق. جرب كل حل واختر ما يناسبك!