الانتقال إلى المحتوى الرئيسي
LogBrew منصة لقابلية الملاحظة (Observability) للمطوّرين ووكلاء البرمجة، مع خطة مجانية سخية ودون الحاجة إلى بطاقة دفع. يضبط هذا الدليل تسجيل السجلات باستخدام Winston وPino في Node.js، ويضيف مسجِّلًا لـ Express، ويرسل كل سجل إلى LogBrew مع تتبّع طلبه. شُغّل كل مثال على Node.js 22 مع Winston 3.19 وPino 10.4 وExpress 5.3 و@logbrew/sdk 0.1.40 و@logbrew/node 0.1.24 و@logbrew/express 0.1.10. وتعرض كل كتلة مخرجات مخرجاتها الفعلية.

اختر Winston أو Pino

تكتب المكتبتان كلتاهما سجلات JSON منظمة. احتفظ بالمكتبة التي يستخدمها تطبيقك بالفعل. ويختلف إعداد LogBrew لكل منهما.

جهّز مشروعًا في LogBrew

1

أنشئ مفتاحًا للمشروع

سجّل الدخول باستخدام الـ CLI. أنشئ مشروعًا وخزّن مفتاح الاستيعاب الخاص به في ملف لا يقرؤه إلا مالكه.
لا يطبع الـ CLI المفتاح. في بيئة الإنتاج، استخدم مدير الأسرار في منصتك.
2

ثبّت الحزم

تتطلب الحزم Node.js 18.19 أو أحدث. ثبّت Winston أو Pino أو كليهما.
3

اضبط المفتاح وهوية النشر

يقرأ createLogBrewNodeClient() المفتاح من LOGBREW_SERVER_API_KEY. واسم الخدمة هو قيمة name في package.json. اضبط LOGBREW_SERVICE_NAME لاستخدام اسم مختلف. تستخدم الأمثلة وحدات ES، لذلك اضبط "type": "module" في package.json.

مستويات السجلات في Node.js

لكل مكتبة أسماء مستويات وأرقام خاصة بها. يخزّن LogBrew 4 مستويات ويحتفظ بالمستوى الأصلي في البيانات الوصفية. في Winston، الرقم الأقل أشد خطورة. وفي Pino، الرقم الأعلى أشد خطورة. اضبط info في بيئة الإنتاج، واضبط debug لتشخيص قصير فقط.

مسجِّل Winston

احفظ هذا الملف باسم winston-app.js. يُسقط التنسيق الأول السجلات التي تقل عن مستوى المسجِّل قبل أن تصل إلى أي وسيلة نقل. تستقبل وسيلة نقل LogBrew كل سجل يكتبه المسجِّل، لذلك تحتاج إلى هذه التصفية.
شغّل node winston-app.js. تتلقى وحدة التحكم سطر JSON واحدًا لكل سجل بالمستوى info أو أعلى. وقد اختُصر تتبّع المكدّس هنا.
يستقبل LogBrew السجلات نفسها، وعددها 3. وتصبح الحقول بيانات وصفية context.*. ترسل وسيلة النقل اسم الخطأ ورسالته، لكن دون تتبّع المكدّس. اضبط includeErrorStack: true في createLogBrewWinstonTransport() لإرسال تتبّع المكدّس. وتصبح كل رسالة أيضًا Breadcrumb (حدثًا قصيرًا مسجَّلًا قبل وقوع المشكلة) في المشكلة التالية. اضبط breadcrumbs: false لإيقاف ذلك.

مسجِّل Pino

احفظ هذا الملف باسم pino-app.js. استدعِ installLogBrewPinoInstrumentation() مرة واحدة قبل أول سجل. فهو يقرأ كل سجل Pino مكتمل. ويظل Pino يكتب إلى وجهته الخاصة.
شغّل node pino-app.js. وقد اختُصر اسم المضيف وتتبّع المكدّس هنا.
يستقبل LogBrew 3 سجلات. ويُسقط Pino سجل debug قبل أن يراه LogBrew. الحقل token غير موجود في LogBrew. يُسقط LogBrew حقول بيانات الاعتماد وملفات تعريف الارتباط ومتن الطلب والاستعلام وعنوان URL وتتبّع المكدّس، ويُبقي مسارات redact في Pino ضابطًا ثانيًا. الحقول pid وhostname وtime افتراضية في Pino، لذلك لا ينسخها LogBrew. يتطلب الالتقاط التلقائي Pino 9.11 أو أحدث ضمن الفرع 9.x، أو Pino 10.1 أو أحدث. لإصدارات Pino الأقدم، استخدم createLogBrewPinoDestination() من @logbrew/sdk وجهةً لـ Pino. لقراءة مخرجات Pino أثناء التطوير، مرّرها إلى pino-pretty.

مسجِّل Express

ينشئ logbrewMiddleware() Span طلب واحدًا لكل طلب. ويُبلغ logbrewErrorHandler() عن الأخطاء كمشكلات. ويحصل سجل Pino داخل الطلب على معرّف التتبّع ومعرّف الـ Span لذلك الطلب. احفظ هذا الملف باسم express-app.js.
شغّل التطبيق. ثم أرسل طلبين من طرفية ثانية.
يستقبل LogBrew هذه الأحداث. ويحمل السجل والـ Span في كل طلب معرّف التتبّع نفسه. يستخدم اسم الـ Span قالب المسار وليس المسار الفعلي. ولا يحمل سجل listening on 3000 أي تتبّع، لأنه خارج أي طلب. اترك الوسيط (middleware) ينشئ عملاء الطلبات الخاصين به. لا تمرّر client المشترك على مستوى العملية إلى logbrewMiddleware() أو logbrewErrorHandler(). ويغلق الوسيط عميل الطلب بعد كل استجابة.

أضف التتبّع إلى سجلات Winston

في Winston، مرّر التتبّع النشط إلى وسيلة النقل.
أضف logbrewTransport إلى قائمة transports في المسجِّل. عندها يحمل سجل Winston داخل طلب Express معرّف التتبّع ومعرّف الـ Span لذلك الطلب.

اقرأ السجلات المخزّنة

يقرأ الأمر الأخير كل سجلات طلب واحد. انسخ <trace_id> من تتبّع أو من مشكلة. للقراءة من CI أو من وكيل برمجة، استخدم مفتاح القراءة الخاص بالمشروع. راجع تحقّق من الإعداد.

أوقف التطبيق دون فقدان السجلات

يرسل العميل الأحداث المنتظرة بعد ثانية واحدة من أول حدث أو عند بلوغ 50 حدثًا. وعندما تفرغ حلقة الأحداث، يرسل العميل الأحداث المتبقية مدة ثانيتين على الأكثر. ويتخطى process.exit() والإشارات هذه الخطوة. استدعِ await client.shutdown() قبل الخروج، كما يفعل معالج SIGTERM في مثال Express.

استكشاف الأخطاء وإصلاحها

لاختيار حقول السجلات، راجع التسجيل المنظم. لأطر العمل الأخرى، راجع دمج SDK.