الانتقال إلى المحتوى الرئيسي
LogBrew منصة لقابلية الملاحظة (Observability) للمطوّرين ووكلاء البرمجة، مع خطة مجانية سخية ودون الحاجة إلى بطاقة دفع. يشرح هذا الدليل تسجيل السجلات في Python باستخدام الوحدة القياسية logging، و5 مستويات للسجلات في Python، ومعالجة الأخطاء في Python، وأنواع أخطاء Python الشائعة. وترسل الأقسام الأخيرة السجلات والأعطال نفسها إلى LogBrew باستخدام logbrew-sdk 0.1.29. شُغّل كل مثال على Python 3.13، وتعرض كل كتلة مخرجات مخرجاتها الفعلية. لتطبيق Flask، استخدم سجلات Flask بدلًا من هذا الدليل. فهو يضيف تتبّعات الطلبات إلى إعداد السجلات نفسه.

اكتب أول سجل في Python

احفظ هذا الملف باسم app.py. استدعِ logging.basicConfig() مرة واحدة عند نقطة دخول البرنامج. أنشئ مسجِّلًا باسم خاص في كل وحدة.
شغّل python3 app.py. تذهب المخرجات إلى مجرى الخطأ القياسي.
لا يظهر سجل debug لأن المستوى هو INFO. يسجّل logger.exception() بالمستوى ERROR ويضيف تتبّع المكدّس (traceback). استدعِه داخل كتلة except فقط. مرّر القيم كوسائط، كما في "payment retry %d of %d", 2, 3. لا يبني Python الرسالة إلا عندما يقبل أحد المعالجات السجل. ويبقى قالب الرسالة ثابتًا في كل إعادة محاولة، لذلك يمكنك البحث عنه.

مستويات السجلات في Python

يرسل المسجِّل السجل فقط عندما يكون مستوى السجل مساويًا لمستوى المسجِّل أو أعلى منه. ويمكن للمعالج أن يضبط مستوى ثانيًا أعلى. يبدأ المسجِّل الجذري بالمستوى WARNING. ويكون مستوى المسجِّل الجديد NOTSET (0)، فيستخدم مستوى المسجِّل الأب. اضبط INFO في بيئة الإنتاج، واضبط DEBUG في التطوير فقط أو لتشخيص قصير.
يعرض السطر الأول سجلات التصحيح لوحدة واحدة. ويزيل السطر الثاني الضجيج الصادر عن مكتبة.

المسجِّلات والمعالجات والمنسِّقات

  • يستقبل المسجِّل الاستدعاء. استخدم logging.getLogger(__name__) ليتبع اسم المسجِّل مسار الوحدة.
  • يرسل المعالج السجلات إلى وجهة، مثل وحدة التحكم أو ملف أو LogBrew.
  • يحوّل المنسِّق السجل إلى نص.
يجب ألا تضبط المكتبة إعدادات السجلات. فهي تضيف logging.NullHandler() فقط إلى مسجِّلها الخاص. ويضبط التطبيق المعالجات والمستويات مرة واحدة. للإعدادات الكبيرة، استخدم logging.config.dictConfig().

معالجة الأخطاء في Python

التقط الاستثناء الأكثر تحديدًا الذي يمكنك معالجته. استخدم else للشيفرة التي تعمل عند النجاح فقط، واستخدم finally للشيفرة التي تعمل دائمًا. استخدم raise ... from error للاحتفاظ بالسبب الأصلي. احفظ هذا الملف باسم orders.py.
تعرض المخرجات الاستثناءين كليهما في السلسلة.
اتبع هذه القواعد لكل استثناء.
  • سجّل الاستثناء مرة واحدة، في المكان الذي تعالجه فيه. لا تسجّله ثم تُعِد رفعه في كل طبقة، لأن كل طبقة تضيف سجلًا مكررًا.
  • لا تكتب except Exception: pass. إذا تجاهلت خطأً، فسجّله بالمستوى WARNING أو أعلى مع ذكر السبب.
  • التقط Exception وليس BaseException. يلتقط BaseException أيضًا KeyboardInterrupt وSystemExit، وهما يوقفان البرنامج عن قصد.
  • عرّف أصناف استثناءات خاصة بك للأخطاء التي يجب على المستدعين معالجتها، كما يفعل OrderError.

أبلغ عن أكثر من خطأ

يستطيع Python 3.11 والإصدارات الأحدث رفع ExceptionGroup. استخدمه عندما يجد فحص واحد أكثر من خلل. عالج كل نوع باستخدام except*.

أنواع أخطاء Python الشائعة

ترث كل الأخطاء المضمّنة التي يستطيع البرنامج معالجتها من Exception. يسرد هذا الجدول أخطاء Python الأكثر ظهورًا وأول ما تفحصه في كل منها. يرث KeyboardInterrupt وSystemExit من BaseException وليس من Exception. فهما ليسا أخطاءً في شيفرتك.

أرسل سجلات Python إلى LogBrew

LogBrewLoggingHandler معالج سجلات قياسي. يرسل إلى LogBrew كل سجل يقبله. ويبقى معالج وحدة التحكم كما هو.
1

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

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

ثبّت الـ SDK

فعّل البيئة الافتراضية للتطبيق. ثم ثبّت الحزمة. تتطلب الحزمة Python 3.10 أو أحدث.
3

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

يضيف العميل الخدمة والبيئة والإصدار إلى كل حدث.
4

أضف المعالج

احفظ هذا الملف باسم worker.py. استدعِ logging.basicConfig() قبل إنشاء العميل. يضيف العميل معالجًا إلى المسجِّل الجذري، ولا يفعل basicConfig() شيئًا إذا كان للمسجِّل الجذري معالج بالفعل.
يرسل HttpTransport() الأحداث في الخلفية بعد ثانية واحدة من أول حدث أو عند بلوغ 50 حدثًا. ويرسل client.shutdown() الأحداث المتبقية ويغلق العميل.
5

شغّل البرنامج

لا تتغير مخرجات وحدة التحكم. يستقبل LogBrew حدث سجل واحدًا لكل سجل. هذا هو الحدث الأول، دون سياق وقت التشغيل المشترك.
تصبح القيم الأولية من extra={...} بيانات وصفية. يحمل الحدث الثاني exceptionName بالقيمة KeyError وexceptionMessage بالقيمة 'seats'. لإرسال نص تتبّع المكدّس كاملًا، أنشئ المعالج مع include_exception_text=True.
6

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

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

اختر السجلات التي تصل إلى LogBrew

امنح المعالج مستواه الخاص لترسل سجلات أقل. وتظل وحدة التحكم تتلقى INFO وما فوقه.
تتحول مستويات Python إلى مستويات LogBrew. ويبقى اسم المستوى الأصلي ورقمه في البيانات الوصفية.

أبلغ عن أعطال Python كمشكلات

يُبلغ install_process_error_capture(client) عن الاستثناءات غير الملتقَطة في السكربتات والعمليات العاملة (workers) وشيفرة بدء التشغيل والخيوط. يصبح كل تعطّل مشكلة واحدة تحمل نوع الاستثناء والرسالة وإطارات المكدّس والأسباب المتسلسلة. ويظل Python يطبع تتبّع المكدّس ويخرج كما كان يفعل من قبل. احفظ هذا الملف باسم startup.py وشغّله.
يستقبل LogBrew مشكلة بالعنوان FileNotFoundError والمستوى critical والآلية python.excepthook. تحتوي إطاراتها على اسم الملف والسطر والدالة، لكن دون المسار الكامل. ويكون مستوى التعطّل داخل خيط هو error. قبل أن يخرج Python، ينتظر الـ SDK اكتمال التسليم مدة ثانيتين على الأكثر.
تتضمن المشكلة رسالة الاستثناء. لا تضع بيانات الاعتماد أو البيانات الشخصية في رسائل الاستثناءات أو رسائل السجلات. راجع التحكم في البيانات الملتقطة.

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

لتطبيقات الويب، راجع سجلات Flask. لاختيار تنسيق السجلات، راجع التسجيل المنظم. لبيئات التشغيل الأخرى، راجع دمج SDK.