تسجيل السجلات في تطبيقات PHP: أفضل الممارسات العملية
تسجيل السجلات ليس مجرد تسجيل للأخطاء في ملف. إنها أداة استراتيجية للمراقبة، وتصحيح الأخطاء، وتدقيق عمل التطبيق. في هذه المقالة، سنشرح كيفية تنظيم تسجيل السجلات في PHP عمليًا، باستخدام الأساليب والمكتبات الحديثة. ستتعلم كيفية تجنب الأخطاء النمطية وجعل السجلات مفيدة حقًا.
1. اختيار المكتبة ومعيار PSR-3
في مجتمع PHP الحديث، المعيار الفعلي هو واجهة PSR-3 (Logger Interface). وهي تحدد مجموعة موحدة من الأساليب لتسجيل السجلات، مما يسمح بتغيير مكتبة التسجيل بسهولة دون إعادة كتابة كود التطبيق.
التنفيذ الأكثر شيوعًا لـ PSR-3 هو مكتبة Monolog. وهي مرنة، وعالية الأداء، وتحتوي على العديد من "المعالجات" (handlers) لإرسال السجلات إلى الملفات، وقواعد البيانات، وSlack، وTelegram، والبريد الإلكتروني، والخدمات السحابية.
تثبيت Monolog عبر Composer:
composer require monolog/monologمثال أساسي للاستخدام:
<?phprequire 'vendor/autoload.php';
use Monolog\\Logger;use Monolog\\Handler\\StreamHandler;
// إنشاء قناة (channel) للسجلات - عادةً باسم التطبيق أو الوحدة$log = new Logger('my_app');// إضافة معالج: كتابة السجلات بمستوى WARNING وما فوق إلى ملف$log->pushHandler(new StreamHandler(__DIR__ . '/logs/app.log', Logger::WARNING));
// الآن يمكنك تسجيل السجلات$log->warning('المستخدم {username} حاول تسجيل الدخول بكلمة مرور خاطئة', ['username' => 'ivan']);$log->error('فشل الاتصال بقاعدة البيانات: {error}', ['error' => $e->getMessage()]);?>لماذا هذا مهم؟ استخدام PSR-3 يجعل الكود الخاص بك مستقلاً عن مكتبة معينة. إذا أردت غدًا الانتقال من Monolog إلى تنفيذ آخر (مثل Log4php)، فستحتاج فقط إلى تغيير تهيئة المسجل، وليس جميع الأماكن التي يتم فيها استدعاء $log->error().
2. مستويات التسجيل: متى تستخدم ماذا
يحدد PSR-3 8 مستويات للتسجيل (من أدنى أولوية إلى أعلى): DEBUG، INFO، NOTICE، WARNING، ERROR، CRITICAL، ALERT، EMERGENCY. الاستخدام الصحيح للمستويات هو أساس السجلات القابلة للقراءة والمفيدة.
- DEBUG — معلومات تصحيح مفصلة، يحتاجها المطور فقط (قيم المتغيرات، تتبع الاستدعاءات). قم بتفعيلها فقط في بيئة التطوير.
- INFO — أحداث مهمة في عمل التطبيق: تسجيل مستخدم، إنشاء طلب، إتمام مهمة cron.
- NOTICE — أحداث عادية ولكنها هامة (مثل استخدام API قديم).
- WARNING — مشاكل محتملة لم توقف تنفيذ السكريبت (محاولة تسجيل دخول فاشلة، استعلام بطيء لقاعدة البيانات).
- ERROR — أخطاء تتطلب تدخلاً: استثناءات، أعطال في الخدمات الخارجية.
- CRITICAL — أعطال حرجة: فقدان الاتصال بقاعدة البيانات، نقص في الذاكرة.
- ALERT — يتطلب إجراءً فوريًا من المسؤول (الموقع غير متاح).
- EMERGENCY — النظام بأكمله غير قابل للتشغيل.
نصيحة عملية: قم بإعداد معالجات مختلفة لمستويات مختلفة. على سبيل المثال، اكتب WARNING وما فوق في ملف، وأرسل ERROR وما فوق أيضًا إلى Telegram/Slack.
// مثال: معالجان لنفس المسجل$log->pushHandler(new StreamHandler(__DIR__ . '/logs/all.log', Logger::DEBUG));$log->pushHandler(new StreamHandler(__DIR__ . '/logs/errors.log', Logger::ERROR));// للأخطاء الحرجة - إرسال إلى Telegram$log->pushHandler(new TelegramBotHandler('TOKEN', 'CHAT_ID', Logger::CRITICAL));3. السجلات المنظمة والسياق
واحدة من الس