Node.js و Express

التسجيل والمراقبة

18 دقيقة الدرس 25 من 40

التسجيل والمراقبة

التسجيل والمراقبة الفعالة ضروريان للحفاظ على تطبيقات Node.js الخاصة بك وتصحيح أخطائها وفهمها في الإنتاج. تساعدك على تتبع الأخطاء وتحليل الأداء واكتشاف المشكلات الأمنية وفهم سلوك المستخدم.

لماذا يهم التسجيل

فوائد التسجيل المناسب:
  • تصحيح مشكلات الإنتاج دون الوصول إلى الخادم
  • تتبع أخطاء واستثناءات التطبيق
  • مراقبة الأحداث الأمنية والأنشطة المشبوهة
  • تحليل عوائق الأداء
  • تدقيق إجراءات المستخدم والامتثال
  • فهم سلوك التطبيق وأنماط الاستخدام
  • التنبيه على الأحداث الحرجة

إعداد Winston Logger

Winston هي مكتبة التسجيل الأكثر شيوعًا لـ Node.js:

npm install winston

إعداد Winston الأساسي:

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.Console({
      format: winston.format.combine(
        winston.format.colorize(),
        winston.format.simple()
      )
    }),
    new winston.transports.File({
      filename: 'logs/error.log',
      level: 'error'
    }),
    new winston.transports.File({
      filename: 'logs/combined.log'
    })
  ]
});

logger.info('بدأ الخادم على المنفذ 3000');
logger.warn('تم تجاوز حد معدل API', { ip: '192.168.1.1' });
logger.error('فشل الاتصال بقاعدة البيانات', { error: err.message });

تسجيل طلب HTTP بـ Morgan

Morgan هو برنامج وسيط لتسجيل طلبات HTTP لـ Express:

npm install morgan
const express = require('express');
const morgan = require('morgan');

const app = express();

app.use(morgan('combined'));

// كتابة السجلات إلى الملف
const accessLogStream = fs.createWriteStream(
  path.join(__dirname, 'logs', 'access.log'),
  { flags: 'a' }
);

app.use(morgan('combined', { stream: accessLogStream }));

نقاط نهاية فحص الصحة

// فحص صحة بسيط
app.get('/health', (req, res) => {
  res.status(200).json({ status: 'ok' });
});

// فحص صحة مفصل
app.get('/health/detailed', async (req, res) => {
  const health = {
    uptime: process.uptime(),
    timestamp: Date.now(),
    status: 'ok',
    checks: {
      database: mongoose.connection.readyState === 1 ? 'up' : 'down',
      redis: await redisClient.ping() ? 'up' : 'down'
    }
  };

  res.status(200).json(health);
});
أفضل ممارسات التسجيل:
  • استخدم مستويات السجل المناسبة
  • قم بتضمين معلومات سياقية (معرف المستخدم، معرف الطلب، إلخ.)
  • لا تسجل أبدًا البيانات الحساسة (كلمات المرور، الرموز، بطاقات الائتمان)
  • استخدم التسجيل المنظم لإمكانية البحث بشكل أفضل
  • نفذ تناوب السجل لمنع مشاكل مساحة القرص
  • قم بإعداد تنبيهات للأخطاء الحرجة
  • راقب حجم السجل للحالات الشاذة
تمرين عملي:
  1. إعداد مسجل Winston مع عمليات نقل متعددة
  2. تنفيذ تسجيل HTTP بـ Morgan المتكامل مع Winston
  3. إنشاء تسجيل منظم لأحداث الأعمال
  4. بناء نقاط نهاية فحص صحة شاملة
  5. تنفيذ تتبع مقاييس التطبيق