المعالجات والمنسّقات والمرشحات
وجّه مخرجات السجل إلى الملفات والتدفقات والوجهات المخصصة
المعالجات والمنسّقات والمرشحات درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
المعالجات توجّه سجلات السجل
يرسل handler سجلات السجل إلى وجهة، مثل وحدة التحكم أو ملف أو نقطة نهاية HTTP وغير ذلك. ويمكن أن يحتوي المسجّل الواحد على عدة معالجات.
import logging
logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)
sh = logging.StreamHandler()
logger.addHandler(sh)
logger.info("Goes to console")StreamHandler
يكتب StreamHandler إلى مجرى، ويكون sys.stderr هو الافتراضي. مرّروا sys.stdout لإخراج stdout.
import logging, sys
logger = logging.getLogger("out")
handler = logging.StreamHandler(sys.stdout)
logger.addHandler(handler)
logger.warning("printed to stdout")FileHandler
يضيف FileHandler السجلات إلى ملف. استخدموا mode="w" للكتابة فوق المحتوى في كل تشغيل.
import logging
logging.basicConfig(
filename="app.log",
filemode="a",
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s"
)
logging.info("Persisted to disk")RotatingFileHandler
دوّروا ملفات السجل تلقائيًا عند تجاوزها حدًا معينًا للحجم، مع الاحتفاظ بعدد N من الملفات الاحتياطية.
from logging.handlers import RotatingFileHandler
import logging
handler = RotatingFileHandler(
"app.log", maxBytes=1_000_000, backupCount=5
)
logging.getLogger().addHandler(handler)TimedRotatingFileHandler
دوّروا ملفات السجل وفق جدول زمني — يوميًا أو أسبوعيًا أو كل ساعة — وهو أمر مثالي للخدمات طويلة التشغيل.
from logging.handlers import TimedRotatingFileHandler
import logging
handler = TimedRotatingFileHandler(
"app.log", when="midnight", backupCount=7
)
logging.getLogger().addHandler(handler)المنسّقات
يتحكم Formatter في تخطيط نص كل سجل. أرفقوه بمعالج باستخدام handler.setFormatter().
import logging
fmt = logging.Formatter(
fmt="%(asctime)s %(levelname)-8s %(name)s — %(message)s",
datefmt="%Y-%m-%dT%H:%M:%S"
)
handler = logging.StreamHandler()
handler.setFormatter(fmt)
logging.getLogger().addHandler(handler)التصفية على مستوى المعالج
لكل معالج مستوى خاص به. ويجب أن يجتاز السجل مستوى المسجّل ومستوى المعالج معًا حتى يُصدر.
import logging
logger = logging.getLogger("app")
logger.setLevel(logging.DEBUG) # logger passes DEBUG+
err_handler = logging.FileHandler("errors.log")
err_handler.setLevel(logging.ERROR) # only ERROR+
logger.addHandler(err_handler)المرشّحات المخصصة
أنشئوا فئة فرعية من logging.Filter وتجاوزوا filter(record) لقبول السجلات أو رفضها وفق أي معيار.
import logging
class SensitiveFilter(logging.Filter):
def filter(self, record):
return "password" not in record.getMessage().lower()
handler = logging.StreamHandler()
handler.addFilter(SensitiveFilter())
logging.getLogger().addHandler(handler)إضافة حقول إضافية باستخدام مرشّح
يمكن للمرشّحات أيضًا تعديل السجل لحقن حقول إضافية، مثل معرّف الطلب، قبل تنسيقه.
import logging
class RequestIDFilter(logging.Filter):
def __init__(self, request_id):
self.request_id = request_id
def filter(self, record):
record.request_id = self.request_id
return True
# fmt: "%(request_id)s %(message)s"معالجات متعددة لمسجّل واحد
أضيفوا عدة معالجات لإرسال سجلات السجل نفسها إلى وجهات متعددة في الوقت نفسه.
import logging
logger = logging.getLogger("multi")
logger.addHandler(logging.StreamHandler()) # console
logger.addHandler(logging.FileHandler("audit.log")) # file
logger.setLevel(logging.INFO)
logger.info("Both destinations receive this")تعطيل النشر
اضبطوا logger.propagate = False لمنع انتقال السجلات إلى المسجّل الجذر وتسجيلها مرتين.
import logging
logger = logging.getLogger("mylib")
logger.propagate = False # stays here, does not reach root
logger.addHandler(logging.StreamHandler())تحقّق سريع
ما الأسلوب الذي يرفق Formatter بـ Handler؟
مراجعة
توجّه المعالجات السجلات، وينسّقها المنسّقون، بينما تمرّر المرشّحات السجلات أو تحجبها انتقائيًا. استخدموا RotatingFileHandler للسجلات المحدودة بالحجم، وTimedRotatingFileHandler للتدوير المستند إلى التاريخ.
الأسئلة الشائعة
هل درس «المعالجات والمنسّقات والمرشحات» مجاني؟
نعم — نص درس «المعالجات والمنسّقات والمرشحات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «المعالجات والمنسّقات والمرشحات»؟
وجّه مخرجات السجل إلى الملفات والتدفقات والوجهات المخصصة تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «المعالجات والمنسّقات والمرشحات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات الوحدة logging
- المعالجات والمنسّقات والمرشحات
- التسجيل المنظّم
- تصحيح الأخطاء باستخدام pdb