0Pricing
Python Academy · درس

أساسيات الوحدة logging

اضبط مسجّلات الأحداث وحدّد مستوياتها وأصدر الرسائل بالشكل المناسب

أساسيات الوحدة logging درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

لماذا نستخدم logging بدلًا من print؟

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

import logging

logging.basicConfig(level=logging.DEBUG)
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")

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

يعرّف Python خمسة مستويات قياسية مرتبة تصاعديًا حسب الخطورة: DEBUG وINFO وWARNING وERROR وCRITICAL. ولا تُصدر إلا الرسائل التي تساوي المستوى المضبوط أو تتجاوزه.

import logging
# Numeric values:
# DEBUG    = 10
# INFO     = 20
# WARNING  = 30
# ERROR    = 40
# CRITICAL = 50

logging.basicConfig(level=logging.WARNING)
logging.debug("hidden")   # not shown
logging.warning("shown")  # shown

الحصول على Logger

استخدموا logging.getLogger(__name__) في كل وحدة برمجية. وينشئ ذلك تسلسلًا هرميًا يطابق بنية الوحدات البرمجية.

import logging

logger = logging.getLogger(__name__)

def process(data):
    logger.info("Processing %d items", len(data))
    return [x * 2 for x in data]

خيارات basicConfig

تضبط basicConfig المسجّل الجذر بسرعة. ومن المعاملات الشائعة: level وformat وfilename وfilemode.

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s %(levelname)s %(name)s — %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)

حقول تنسيق السجل

حقول التنسيق الأساسية: %(levelname)s و%(name)s و%(message)s و%(asctime)s و%(filename)s و%(lineno)d.

import logging

fmt = "%(asctime)s | %(levelname)-8s | %(name)s:%(lineno)d | %(message)s"
logging.basicConfig(level=logging.DEBUG, format=fmt)
logging.info("Server started on port 8080")

تسجيل الاستثناءات

استخدموا logger.exception() داخل كتلة except لتسجيل الرسالة وأثر التتبع الكامل.

import logging
logger = logging.getLogger(__name__)

try:
    1 / 0
except ZeroDivisionError:
    logger.exception("Division failed")
    # Logs message + traceback automatically

سياق إضافي باستخدام extra=

مرّروا قاموسًا باعتباره extra= لإضافة حقول مخصصة إلى سجل السجل.

import logging
logger = logging.getLogger(__name__)

logging.basicConfig(
    format="%(asctime)s %(levelname)s [%(user)s] %(message)s"
)
logger.info("Login successful", extra={"user": "alice"})

تنسيق السلاسل النصية المؤجل

مرّروا معاملات التنسيق بشكل منفصل — ولا تنسّقوا السلاسل مسبقًا. فهذا يتجنب تكلفة إنشاء السلسلة عندما تُستبعد الرسالة.

import logging
logger = logging.getLogger(__name__)

# BAD (always builds the string):
logger.debug(f"Processing {len(data)} items")

# GOOD (only builds if DEBUG is enabled):
logger.debug("Processing %d items", len(data))

تعطيل التسجيل

استدعوا logging.disable(level) لكبت جميع الرسائل التي تصل إلى ذلك المستوى عالميًا — وهذا مفيد في الاختبارات.

import logging

logging.disable(logging.CRITICAL)  # suppress everything
# All log calls now silently do nothing

logging.disable(logging.NOTSET)    # re-enable

التسلسل الهرمي للمسجّلات

تستخدم أسماء المسجّلات النقاط كفواصل. وتنشر المسجّلات الفرعية سجلاتها إلى المسجّلات الأصلية ما لم تكن قيمة propagate=False.

import logging

parent = logging.getLogger("myapp")
child = logging.getLogger("myapp.database")

# child propagates to parent by default
child.warning("DB slow")  # also appears in myapp's handlers

المسجّل الجذر

المسجّل الجذر، الناتج عن logging.warning() وما شابه، هو سلف جميع المسجّلات. اضبطوه باستخدام basicConfig أو بإضافة المعالجات إليه مباشرةً.

import logging

root = logging.getLogger()  # root logger
root.setLevel(logging.DEBUG)

handler = logging.StreamHandler()
root.addHandler(handler)

تحقّق سريع

أي أسلوب للتسجيل ينبغي استخدامه داخل كتلة except لإدراج أثر التتبع الكامل تلقائيًا؟

مراجعة

استخدموا مسجّلات مسماة مع getLogger(__name__)، واضبطوها عبر basicConfig، ومرّروا معاملات التنسيق بشكل مؤجل، واستخدموا logger.exception() لآثار تتبع الأخطاء. وتشكل المسجّلات تسلسلًا هرميًا يتجذر في المسجّل الجذر.

الأسئلة الشائعة

هل درس «أساسيات الوحدة logging» مجاني؟

نعم — نص درس «أساسيات الوحدة logging» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «أساسيات الوحدة logging»؟

اضبط مسجّلات الأحداث وحدّد مستوياتها وأصدر الرسائل بالشكل المناسب تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «أساسيات الوحدة logging»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات الوحدة logging
  2. المعالجات والمنسّقات والمرشحات
  3. التسجيل المنظّم
  4. تصحيح الأخطاء باستخدام pdb
← العودة إلى Python Academy