البرمجة

دليل استخدام التسجيل في بايثون

كيفية استخدام التسجيل Logging في بايثون 3

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

1. مقدمة في التسجيل في بايثون

عند العمل على تطبيقات برمجية، من المهم جدًا أن تتمكن من تتبع الأحداث والأنشطة المختلفة التي تحدث داخل البرنامج. سواء كنت بصدد تطوير تطبيق صغير أو نظام معقد، فإن التسجيل يوفر لك وسيلة مرنة وفعّالة لتوثيق حالة البرنامج وكتابة رسائل تفصيلية حول المشاكل والأخطاء. توفر مكتبة logging في بايثون هذه القدرة، وتمكنك من تخصيص أنواع الرسائل، مستواها، وطريقة تخزينها.

2. كيفية إعداد مكتبة التسجيل في بايثون

قبل أن تتمكن من استخدام التسجيل في بايثون، يجب عليك أولاً استيراد مكتبة logging. هذه المكتبة تعد جزءاً من مكتبات بايثون القياسية ولا تحتاج إلى تثبيت إضافي. إليك طريقة استيراد المكتبة:

python
import logging

إعداد مبدئي

أحد الأساليب الأساسية لاستخدام التسجيل هو إعداد “جهاز تسجيل” (logger) الذي يحدد كيفية التعامل مع الرسائل المسجلة. بعد استيراد المكتبة، يمكنك إعداد جهاز تسجيل أساسي باستخدام الكود التالي:

python
logging.basicConfig(level=logging.DEBUG)

في هذا المثال، level=logging.DEBUG يعني أنه سيتم تسجيل جميع الرسائل التي تأتي من جميع المستويات، بدءًا من DEBUG (أدنى مستوى) وحتى CRITICAL (أعلى مستوى).

مستوى الرسائل

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

  1. DEBUG: يستخدم لتسجيل رسائل تفصيلية أثناء التطوير أو لتصحيح الأخطاء.

  2. INFO: يستخدم لتسجيل معلومات عامة حول سير العمل.

  3. WARNING: يستخدم لتحذير المستخدم من حدوث مشكلة محتملة.

  4. ERROR: يستخدم لتسجيل الأخطاء التي تؤثر على سير العمل.

  5. CRITICAL: يستخدم لتسجيل الأخطاء الحرجة التي تتسبب في توقف البرنامج.

3. كيفية استخدام التسجيل في بايثون

تسجيل رسائل

عند إعداد logging.basicConfig()، يمكن البدء في تسجيل الرسائل باستخدام الوظائف المناسبة التي توفرها مكتبة logging. إليك بعض الأمثلة على كيفية استخدام كل مستوى:

  • DEBUG:

python
logging.debug("هذه رسالة من المستوى DEBUG")
  • INFO:

python
logging.info("تم تحميل البيانات بنجاح")
  • WARNING:

python
logging.warning("الذاكرة شبه ممتلئة")
  • ERROR:

python
logging.error("حدث خطأ أثناء تحميل البيانات")
  • CRITICAL:

python
logging.critical("تعذر الاتصال بالخادم. البرنامج سيتوقف.")

إضافة تفاصيل إضافية

يمكنك أيضاً إضافة تفاصيل إضافية إلى الرسائل المسجلة، مثل توقيت التسجيل أو اسم الملف أو رقم السطر الذي تم فيه التسجيل. وذلك باستخدام المعاملات المتقدمة في إعدادات logging.basicConfig(). على سبيل المثال:

python
logging.basicConfig( format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG )

سيقوم هذا الكود بتنسيق الرسائل لتشمل تاريخ ووقت الرسالة، المستوى (مثل DEBUG أو ERROR)، والنص الفعلي للرسالة.

4. المخرجات والتخزين

الطباعة إلى وحدة التحكم

بافتراض أنك تستخدم logging.basicConfig() بدون تحديد مخرج، فإن الرسائل سيتم طباعتها إلى وحدة التحكم (المعروفة أيضًا بـ stdout). ستظهر الرسائل وفقًا للمستوى الذي حددته في إعدادات التسجيل.

تخزين الرسائل في ملف

إذا كنت ترغب في تخزين الرسائل المسجلة في ملف بدلاً من طباعتها على وحدة التحكم، يمكنك تحديد اسم الملف باستخدام المعامل filename:

python
logging.basicConfig( filename='logfile.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s' )

سيتم الآن تخزين الرسائل في الملف logfile.log بدلاً من طباعتها على وحدة التحكم. كما يمكنك تخصيص التنسيق ليشمل مزيد من التفاصيل.

إضافة سجل إضافي (Handler)

باستخدام logging، يمكنك أيضًا إضافة معالجات متعددة (handlers). على سبيل المثال، يمكنك طباعة الرسائل إلى وحدة التحكم وكذلك تخزينها في ملف في نفس الوقت:

python
logger = logging.getLogger() # Handler للطباعة إلى وحدة التحكم console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # Handler لتخزين الرسائل في ملف file_handler = logging.FileHandler('logfile.log') file_handler.setLevel(logging.DEBUG) # تحديد تنسيق الرسائل formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # إضافة المعالجات إلى جهاز التسجيل logger.addHandler(console_handler) logger.addHandler(file_handler)

5. استخدام التسجيل مع استثناءات (Exceptions)

تعد إضافة معلومات عن الاستثناءات (exceptions) إلى سجلات البرنامج جزءًا أساسيًا في تتبع الأخطاء. يمكنك استخدام logging.exception() لالتقاط استثناء مع تفاصيله بشكل مباشر:

python
try: x = 1 / 0 except ZeroDivisionError: logging.exception("حدث خطأ بسبب القسمة على صفر")

سيقوم هذا بتسجيل رسالة تتضمن تفاصيل الاستثناء (مثل نوعه والمكان الذي وقع فيه).

6. تخصيص جهاز التسجيل (Logger)

يمكنك تخصيص جهاز التسجيل الخاص بك باستخدام getLogger() للحصول على كائن تسجيل قابل للإعدادات المخصصة. هذا يسمح لك بإنشاء سجلات متعددة داخل التطبيق بحيث يمكن لكل جزء من التطبيق تسجيل الرسائل بشكل مستقل:

python
logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # إضافة معالج (Handler) console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) logger.addHandler(console_handler) # تسجيل الرسائل logger.debug("رسالة DEBUG من my_logger") logger.info("رسالة INFO من my_logger")

7. التوثيق والتنظيم

تعتبر مكتبة logging في بايثون مثالية للبرمجيات الكبيرة والمعقدة التي تتطلب تنظيمًا واضحًا وإدارة مرنة للرسائل. باستخدام المعالجات (handlers)، يمكنك إرسال الرسائل إلى أماكن متعددة، مثل الملفات، وحدات التحكم، البريد الإلكتروني، وحتى قواعد البيانات. كما يمكنك أيضًا استخدام filters للتحكم في الرسائل التي تتم معالجتها بناءً على محتوى الرسائل أو المعايير المخصصة.

8. استخدام التسجيل في التطبيقات الكبيرة

في تطبيقات البرمجيات الكبيرة، مثل الأنظمة التي تتطلب مراقبة الأداء أو التطبيقات التي تعمل في بيئات متعددة، يصبح التسجيل جزءًا أساسيًا من العمل. يمكن للرسائل المسجلة أن تقدم إشارات مهمة عن التفاعلات بين المكونات المختلفة في النظام.

مثال على استخدام التسجيل في تطبيق معقد:

python
def process_data(data): logging.debug("بدء معالجة البيانات") try: result = data * 2 logging.info("تمت معالجة البيانات بنجاح") return result except Exception as e: logging.error("خطأ أثناء معالجة البيانات: %s", e) raise

في هذا المثال، يتم تسجيل كل خطوة من عملية معالجة البيانات باستخدام مستوى DEBUG وINFO، بينما يتم توثيق الأخطاء باستخدام ERROR.

9. فوائد استخدام التسجيل في بايثون

  1. تحسين التتبع: يمكن للمطورين تتبع سير العمل وحالة النظام في كل مرحلة من مراحل التنفيذ.

  2. تشخيص الأخطاء: يوفر التسجيل طريقة فعالة لمراقبة الأخطاء وتحليل سبب حدوثها.

  3. المرونة: يوفر مستوى عالي من التخصيص عبر معالجات متعددة، مما يسمح بتوجيه الرسائل إلى أماكن مختلفة.

  4. الأمان: يعزز من الأمان من خلال حفظ السجلات التي يمكن استخدامها في حال حدوث مشاكل مع النظام.

10. الخلاصة

التسجيل في بايثون هو أداة أساسية ومهمة للغاية لتوثيق ومراقبة حالة تطبيقات البرمجيات. مع مرونة المكتبة والعديد من الخيارات المتاحة مثل تخصيص التنسيقات والمخرجات، يمكن للمطورين التأكد من أن برامجهم ستكون أكثر سهولة في الصيانة وأقل عرضة للمشاكل المستقبلية.