تسجيل الأحداث في تطبيقات JavaScript: أفضل الممارسات لـ Node.js

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة
```html

تسجيل الأحداث في تطبيقات JavaScript: أفضل الممارسات لـ Node.js



تسجيل الأحداث (Logging) ليس مجرد تسجيل رسائل في وحدة التحكم. في تطبيقات Node.js الحديثة، هو أداة بالغة الأهمية لتصحيح الأخطاء والمراقبة والتدقيق. يتيح تسجيل الأحداث الذي تم إعداده بشكل صحيح العثور السريع على الأخطاء وتحليل سلوك المستخدمين وضمان استقرار الخدمة. في هذه المقالة، سنستعرض أفضل الممارسات لتسجيل الأحداث في JavaScript (Node.js)، بدءًا من اختيار المكتبة وحتى إعداد التجميع المركزي للسجلات.



1. اختيار مكتبة تسجيل الأحداث



أداة console.log المدمجة جيدة فقط للتطوير. بالنسبة لبيئة الإنتاج (production)، هناك حاجة إلى مكتبات متخصصة توفر مستويات تسجيل الأحداث والتنسيق وتدوير الملفات والتكامل مع الأنظمة الخارجية.



دعنا نلقي نظرة على ثلاثة خيارات شائعة:



  • Winston — المكتبة الأكثر شيوعًا. مرنة، وتدعم العديد من وسائل النقل (الملفات، وحدة التحكم، HTTP، قواعد البيانات). مثالية للأنظمة المعقدة.
  • Pino — مسجل أحداث فائق السرعة. يُوصى به للتطبيقات عالية التحميل حيث تكون الأداء حرجًا.
  • Bunyan — يُنشئ سجلات بتنسيق JSON. مناسب للمعالجة الآلية.


مثال على إعداد Winston:



const winston = require('winston');

const logger = winston.createLogger({ level: 'info', format: winston.format.json(), defaultMeta: { service: 'user-service' }, transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }), ],});

if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple(), }));}

logger.info('تم تشغيل الخدمة');logger.error('خطأ في الاتصال بقاعدة البيانات', { db: 'main' });


2. استخدام مستويات تسجيل الأحداث



تساعد مستويات تسجيل الأحداث في تصفية الرسائل حسب الأهمية. التسلسل الهرمي القياسي (من الأقل إلى الأكثر أهمية):



  • debug — معلومات تفصيلية لتصحيح الأخطاء (للتطوير فقط).
  • info — أحداث قياسية (تمت معالجة الطلب، تم تسجيل دخول المستخدم).
  • warn — مشاكل محتملة (انخفاض مستوى الذاكرة، طلب بطيء).
  • error — أخطاء حرجة (تعطل وحدة، استثناء).


القاعدة: في الإنتاج، استخدم المستوى info أو أعلى. يجب تعطيل debug لتجنب امتلاء الأقراص وتقليل الأداء.



مثال على تغيير المستوى ديناميكيًا:



const logger = require('./logger');

if (process.env.LOG_LEVEL) { logger.level = process.env.LOG_LEVEL;}

logger.debug('هذه الرسالة لن تظهر في الإنتاج');logger.info('تم تسجيل دخول المستخدم');logger.error('فشل حفظ البيانات');


3. السجلات المنظمة (JSON)



من الصعب تحليل السجلات النصية. الممارسة الحديثة هي استخدام السجلات المنظمة بتنسيق JSON. يتيح ذلك التكامل بسهولة مع أنظمة التحليل (ELK, Splunk, Grafana Loki).



ما يجب أن يكون في كل سجل:



  • timestamp — الوقت الدقيق للحدث (ISO 8601).
  • level — مستوى تسجيل الأحداث.
  • message — وصف قابل للقراءة البشرية.
  • context — بيانات إضافية (معرف الطلب، اسم المستخدم، رمز الخطأ).


مثال مع Pino:



const pino = require('pino');

const logger = pino({ level: 'info', timestamp: pino.stdTimeFunctions.isoTime, formatters: { level(label) { return ```

المدونات

توصيات الكتب