تسجيل الدخول في تطبيقات JavaScript: أفضل الممارسات للمبتدئين

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

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

ابدأ الدورة

تسجيل الدخول في تطبيقات JavaScript: أفضل الممارسات للمبتدئين



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



1. لماذا لا يجب الاعتماد على console.log؟



يستخدم العديد من المطورين المبتدئين console.log لكل شيء. هذا مناسب في مرحلة التطوير، لكن في بيئة الإنتاج يؤدي هذا النهج إلى مشاكل:



  • لا توجد مستويات تسجيل — لا يمكنك تصفية الأخطاء من الرسائل المعلوماتية.
  • صعوبة إدارة المخرجات — لا يمكنك تعطيل السجلات لوحدات معينة.
  • أداء ضعيف — تحويل الكائنات إلى سلسلة نصية في console.log قد يكون مكلفًا.
  • غياب الهيكلة — السجلات ليس لها تنسيق موحد (JSON، وقت، مستوى).


بدلاً من ذلك، استخدم مكتبات متخصصة. إليك مثال بسيط لكن صحيح باستخدام Winston:



// logger.jsconst winston = require('winston');

const logger = winston.createLogger({ level: 'info', format: winston.format.json(), 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(), }));}

module.exports = logger;


2. مستويات تسجيل الدخول: متى تستخدم كل منها



المستويات القياسية لتسجيل الدخول (حسب تصاعد الخطورة): debug، info، warn، error. من المهم فهم متى يتم استخدام كل مستوى:



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


مثال على الاستخدام الصحيح مع مكتبة Pino (الأسرع لـ Node.js):



const pino = require('pino');

const logger = pino({ level: process.env.LOG_LEVEL || 'info', transport: { target: 'pino-pretty', options: { colorize: true } }});

// الاستخدامlogger.info({ userId: 123 }, 'المستخدم سجل الدخول إلى النظام');logger.error(new Error('خطأ في الاتصال بقاعدة البيانات'), 'خطأ حرج');logger.debug('قيمة المتغير x = 42'); // لن يظهر إذا كان level = 'info'


3. تسجيل الدخول المنظم: JSON والسياق



بدلاً من السلاسل النصية، استخدم سجلات منظمة (عادةً JSON). هذا يتيح لك:



  • تحليل السجلات بسهولة باستخدام أدوات (ELK, Graylog).
  • إضافة سياق (معرف الطلب، المستخدم، الإصدار).
  • تصفية البيانات وتجميعها.


مثال على سجل منظم مع سياق:



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

app.use((req, res, next) => { req.requestId = uuidv4(); next();});

app.get('/api/users', async (req, res) => { logger.info({ requestId: req.requestId, method: req.method, url: req.originalUrl, ip: req.ip }, 'طلب وارد');

try { const users = await getUsers(); logger.info({ requestId: req.requestId, count: users.length }, 'تم الحصول على المستخدمين'); res.json(users); } catch (err) { logger.error({

المدونات

توصيات الكتب