وراثة السجلات في بايثون وكيفية التعامل معها
في عالم البرمجة بلغة بايثون، يعتبر مفهوم تسجيل البيانات من الأساسيات المهمة التي غالبًا ما يمر بها المطورون. تتيح لك مكتبة logging
في بايثون إنشاء نظام لتسجيل الأحداث والمعلومات المهمة في تطبيقاتك. ومع ذلك، فإن مفهوم وراثة التسجيل أو "Logging Inheritance" يعد من الجوانب المعقدة التي تتطلب بعض التفاصيل الدقيقة لفهم كيفية تطبيقها بشكل صحيح.
أهمية وراثة التسجيل في بايثون
تعتمد وراثة التسجيل في بايثون على فكرة أن السجلات (loggers) يمكن أن ترث خصائصها من سجلات أخرى. هذا يعني أنه إذا كان لديك سجل أُعد ليكون سجلًا فرعيًا (child logger) لسجل آخر (parent logger)، فسيتمكن السجل الفرعي من وراثة إعدادات السجل الأب مثل المستوى (level) والمعالجات (handlers). يساعد هذا في تبسيط إدارة السجلات في التطبيقات الكبيرة.
تحسين تكوين السجلات
عند تكوين أدوات تسجيل البيانات في بايثون، من المهم التحقق من موقع الملف. يجب أن يتم تكوين أدوات تسجيل البيانات في ملف core/__init__.py
بدلاً من core/__main__.py
، حيث يُستخدم الأخير عند تنفيذ الأوامر كالوحدات (modules) باستخدام الأمر python -m core
.
تعديل المفاتيح في التكوين
عند إعداد التنسيق للسجلات، يجب أن نكون حذرين في استخدام المفاتيح الصحيحة. يُفضل أن تُطلق على مفتاح التنسيق اسم "format" وليس "fmt". كما يتوجب علينا أن نتأكد من أن أسماء مستويات السجل مثل "INFO" و"DEBUG" تعتمد على الأسلوب الصحيح.
تجميع الكود بشكل صحيح
إليك كيفية تكوين السجل بشكل صحيح في بايثون:
# core/__init__.py
import logging
import logging.config
from pydantic import BaseModel
class BaseLoggerConfig(BaseModel):
LOG_FORMAT: str = "%(levelname)s %(asctime)s %(name)s:%(lineno)d: %(message)s"
DATEFMT: str = "%Y-%m-%d %H:%M:%S"
LOG_LEVEL: int = logging.INFO
version: int = 1
disable_existing_loggers: bool = False
formatters: dict = {
"default": {
"format": LOG_FORMAT,
"datefmt": DATEFMT,
},
}
filters: dict = {}
handlers: dict = {
"default": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": "ext://sys.stderr",
}
}
loggers: dict = {}
def __init__(self, name: str, **data):
super().__init__(**data)
self.loggers[name] = {
"handlers": ["default"],
"level": self.LOG_LEVEL,
"propagate": False,
}
LOG_CONFIG = BaseLoggerConfig(__name__)
logging.config.dictConfig(LOG_CONFIG)
من خلال الكود أعلاه، يمكننا إعداد نظام تسجيل فعال يمكن تمديده بسهولة.
اختبار إعدادات السجل
بعد إعداد التكوين، يمكنك استخدام الوظيفة المخصصة للاختبار كالتالي:
# core/utils.py
import logging
logger = logging.getLogger(__name__)
def test():
logger.info(f"أنا سجل من {__name__}")
عند تنفيذ كود الاختبار، ستحصل على مخرجات واضحة تسجل المعلومات الخاصة بك.
تعديل إضافي للتنسيق
قد تحتاج أحيانًا إلى استخدام بادئة خاصة بالمستوى كما هو الحال في uvicorn
. لذا يجب إلغاء تعليق جزء من الكود:
# core/__init__.py
formatters: dict = {
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"format": LOG_FORMAT,
"datefmt": DATEFMT,
},
}
بهذا يمكنك الحصول على مخرجات تسجيل محسنة تُظهر أهمية كل مستوى.
الخاتمة
من خلال التنفيذ الجيد للوراثة في نظم تسجيل البيانات، يمكننا تبسيط وإدارة السجلات في تطبيقات بايثون بشكل فعال. تعتبر وراثة التسجيل في بايثون – Stack Overflow جزءًا حيويًا من تطوير برمجيات قوية وقابلة للتطوير. باتباع أفضل الممارسات كما ذُكر، يمكنك تقليل التعقيد وتحسين قابلية الصيانة لتطبيقاتك المستقبلية.