- 1 1. الدليل الكامل لتسجيل الأحداث في بايثون | من التصحيح إلى الإنتاج
- 2 2. ما هو تسجيل الأحداث في بايثون؟ المفاهيم الأساسية ولماذا هو ضروري
- 3 3. كيفية بدء التسجيل باستخدام وحدة logging المدمجة في بايثون
- 4 4. كيفية إخراج السجلات إلى ملفات وإلى وحدة التحكم في بايثون
- 5 5. تقنيات التسجيل الفعّالة في مشاريع بايثون
- 6 6. ثلاث مكتبات موصى بها لتعزيز تسجيل بايثون
- 7 7. حل الأسئلة حول تسجيل Python!
- 8 8. إتقان تسجيل Python لتعزيز كفاءة التطوير
1. الدليل الكامل لتسجيل الأحداث في بايثون | من التصحيح إلى الإنتاج
عند تطوير البرامج بلغة بايثون، يكون التسجيل (logging) أمرًا حيويًا لتحديد الأخطاء والتحقق من سلوك البرنامج.
تشرح هذه المقالة كل شيء من المفاهيم الأساسية إلى التقنيات العملية حتى يتمكن مبتدئو بايثون من استخدام التسجيل بفعالية.
2. ما هو تسجيل الأحداث في بايثون؟ المفاهيم الأساسية ولماذا هو ضروري
التسجيل هو آلية لتسجيل المعلومات والأخطاء التي تحدث أثناء تشغيل البرنامج. الاستخدام السليم للتسجيل يوفر الفوائد التالية:
فوائد التسجيل
- تحليل الأخطاء بسهولة يساعد على تحديد مكان حدوث الأخطاء وأسبابها.
- متابعة سلوك البرنامج يمكنك رؤية أي الأجزاء تعمل بشكل صحيح وأين تحدث المشكلات.
- تمكين المراقبة التشغيلية يوفر الأساس لمراقبة صحة النظام باستمرار في بيئة الإنتاج.
الاختلافات عن print()
دالة print()، التي يستخدمها المبتدئون كثيرًا، مريحة للتصحيح لكنها تملك القيود التالية في التطوير الجاد:
- لا يمكن تحديد وجهة الإخراج بمرونة (مثل الملفات أو الخدمات الخارجية).
- لا يمكن إدارة مستويات السجلات (مستويات الخطورة).
يمكن معالجة هذه المشكلات باستخدام وحدة logging القياسية في بايثون.
3. كيفية بدء التسجيل باستخدام وحدة logging المدمجة في بايثون
تتضمن بايثون وحدة logging المدمجة، التي تجعل من السهل إخراج السجلات. يشرح هذا القسم الاستخدام الأساسي.
نظرة عامة على مستويات السجل
تسمح لك وحدة logging بتعيين “مستوى السجل” لتحديد خطورة رسائل السجل. المستويات الرئيسية هي:
- DEBUG : معلومات تصحيحية. مفيدة أثناء التطوير.
- INFO : رسائل معلوماتية. تشير إلى تقدم البرنامج.
- WARNING : تحذيرات. تشير إلى مشاكل محتملة.
- ERROR : أخطاء. تشير إلى أن البرنامج لا يعمل بشكل صحيح.
- CRITICAL : أخطاء حرجة. تشير إلى تعطل النظام.
الاستخدام الأساسي
فيما يلي مثال بسيط لتسجيل الأحداث باستخدام وحدة logging.
import logging
# Basic logging configuration
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Example output for each log level
logging.debug('This is debug information.')
logging.info('This is an info message.')
logging.warning('This is a warning message.')
logging.error('This is an error message.')
logging.critical('This is a critical error message.')
شرح الكود
basicConfig: يضبط إعدادات إخراج السجلات. تسمح لك الوسيطةlevelبتحديد الحد الأدنى لمستوى السجل الذي سيتم إخراجه.- تحديد الصيغة : تسمح لك الوسيطة
formatبتخصيص صيغة رسائل السجل. - مثال:
%(asctime)sيمثل الطابع الزمني،%(levelname)sمستوى السجل، و%(message)sمحتوى الرسالة.
4. كيفية إخراج السجلات إلى ملفات وإلى وحدة التحكم في بايثون
يمكن حفظ السجلات ليس فقط على الشاشة بل أيضًا في ملفات أو أنظمة خارجية. يشرح هذا القسم كيفية تكوين وجهات إخراج متعددة.
التسجيل إلى وحدة التحكم
logging بشكل افتراضي، تُخرج إعدادات الوحدة السجلات إلى وحدة التحكم.
import logging
logging.basicConfig(level=logging.INFO)
logging.info('Example of logging to the console')
التسجيل إلى ملف
لتسجيل السجلات في ملف، حدد وسيطة filename في basicConfig.
import logging
logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(message)s')
logging.info('This is an example of logging to a file.')
التسجيل إلى كل من وحدة التحكم والملف
عند تكوين وجهات إخراج متعددة، استخدم المعالجات (handlers) من logging.
import logging
# Create a logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# Console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# File handler
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.INFO)
# Configure the handler format
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# Add handlers to the logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
logger.info('Example log that will be output to both the console and the file.')
5. تقنيات التسجيل الفعّالة في مشاريع بايثون
يقدم هذا القسم أفضل ممارسات التسجيل المفيدة في المشاريع الواقعية. تعلم تقنيات لتصحيح الأخطاء بفعالية وتحسين إدارة السجلات.
تكوين تسجيل موحد
في المشاريع الكبيرة، يعتبر تكوين التسجيل الموحد مهمًا. عندما يتعاون عدة وحدات أو أعضاء فريق، فإن ضبط صيغ موحدة ومستويات تسجيل يجعل التحليل وحل المشكلات أسهل.
فيما يلي مثال على تكوين تسجيل موحد.
import logging
# Common logging configuration function
def setup_logger(name, log_file, level=logging.INFO):
handler = logging.FileHandler(log_file)
handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger = logging.getLogger(name)
logger.setLevel(level)
logger.addHandler(handler)
return logger
# Create loggers for each module
app_logger = setup_logger('app_logger', 'app.log')
db_logger = setup_logger('db_logger', 'db.log')
# Example of log output
app_logger.info('Application log message')
db_logger.error('Database error message')
دمج معالجة الأخطاء والتسجيل
في معالجة الأخطاء (معالجة الاستثناءات)، يتيح التسجيل السليم للمعلومات فهم تفاصيل المشكلات بسرعة.
فيما يلي مثال على التسجيل عند حدوث استثناء.
import logging
logging.basicConfig(filename='error.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')
try:
# Example code that raises an error
1 / 0
except ZeroDivisionError as e:
logging.error(f'A division-by-zero error occurred: {e}')
تضمين معلومات السياق في رسائل السجل
اعتمادًا على المشروع، يتيح تضمين معلومات سياق إضافية (مثل معرف المستخدم، معرف المعاملة) في رسائل السجل إجراء تحليل أكثر تفصيلاً.
import logging
logging.basicConfig(filename='context.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
user_id = 12345
transaction_id = 'txn_001'
logging.info(f'User ID: {user_id}, Transaction ID: {transaction_id} - Operation succeeded.')
تصفية السجلات بشكل صحيح
عند توليد كميات كبيرة من السجلات، يكون من الفعّال استخدام التصفية لإخراج السجلات التي تحتاجها فقط. فيما يلي مثال على مرشح مخصص.
import logging
class DebugFilter(logging.Filter):
def filter(self, record):
return record.levelno == logging.DEBUG
logger = logging.getLogger('filtered_logger')
handler = logging.StreamHandler()
handler.addFilter(DebugFilter())
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.debug('This is a debug log.')
logger.info('This will not be displayed.')
6. ثلاث مكتبات موصى بها لتعزيز تسجيل بايثون
بالإضافة إلى وحدة logging المدمجة في بايثون، هناك عدة مكتبات تسجيل مفيدة. يسلط هذا القسم الضوء على ثلاث مكتبات شائعة بشكل خاص.
Loguru: مكتبة تسجيل بسيطة للمبتدئين
الميزات:
- تثبيت وإعداد سهل.
- بنية أكثر بديهية مقارنةً بـ
loggingالقياسي.
التثبيت:
pip install loguru
الاستخدام الأساسي:
from loguru import logger
logger.info('This is log output using Loguru.')
logger.error('Error messages can be logged easily, too.')
Logzero: مكتبة تسجيل خفيفة الوزن وسهلة الاستخدام
الميزات:
- قابلة للتخصيص بسهولة.
- تدوير السجلات مدمج.
التثبيت:
pip install logzero
الاستخدام الأساسي:
from logzero import logger
logger.info('Log output using Logzero')
logger.warning('This is a warning message.')
Structlog: مكتبة متخصصة في التسجيل الهيكلي
الميزات:
- تُخرج السجلات بسهولة بصيغة JSON.
- مناسبة جيدًا للأنظمة الموزعة وبيئات السحابة.
التثبيت:
pip install structlog
الاستخدام الأساسي:
import structlog
logger = structlog.get_logger()
logger.info('event', user='12345', action='login')
7. حل الأسئلة حول تسجيل Python!
س1. لماذا لا يتم إخراج السجلات؟
الإجابة:
تحقق من أن مستوى السجل مضبوط بشكل مناسب. بشكل افتراضي، يتم إخراج السجلات فقط عند مستوى WARNING أو أعلى.
س2. ماذا لو نما ملف السجل كبيرًا جدًا؟
الإجابة:
يمكنك استخدام RotatingFileHandler لتدوير ملفات السجل عندما تصل إلى حجم معين.
س3. كيف تختار المكتبات الخارجية؟
الإجابة:
اختر بناءً على حجم مشروعك ومتطلباته. للمشاريع الصغيرة، Loguru مناسبة؛ إذا كنت بحاجة إلى تسجيل هيكلي، فإن Structlog أكثر ملاءمة.
8. إتقان تسجيل Python لتعزيز كفاءة التطوير
غطي هذا المقال كل شيء من أساسيات التسجيل في Python إلى التقنيات المتقدمة والمكتبات الخارجية المفيدة. يمكن للتسجيل السليم أن يحسن بشكل كبير من كفاءة تصحيح الأخطاء ودقة مراقبة النظام. جرّبه بدءًا من اليوم!

