مقدمة: لماذا التسجيل (Logging) هو أساس تطبيق PHP موثوق
التسجيل (log) هو عملية تسجيل الأحداث التي تحدث في التطبيق في سجل خاص (ملف log). بالنسبة لمطور PHP، فإن التسجيل الجيد ليس مجرد "إضافة في الرصيد"، بل هو ضرورة. بدونه، يصبح تصحيح أخطاء الإنتاج تخمينًا، وتصبح مراقبة الأداء مستحيلة. يمكن أن يؤدي التسجيل الذي تم تكوينه بشكل سيء إلى تسرب بيانات حساسة أو، على العكس، فقدان معلومات بالغة الأهمية.
في هذه المقالة، سنقوم بتحليل أفضل ممارسات التسجيل في PHP: من اختيار المكتبة ومستويات التسجيل إلى تنظيم الرسائل والأمان. ستتعلم كيفية تحويل echo و var_dump المتناثرة إلى نظام مراقبة احترافي.
1. اختيار المكتبة: PSR-3 و Monolog
في مجتمع PHP الحديث، المعيار الفعلي هو الواجهة Psr\\Log\\LoggerInterface (PSR-3). وهي تحدد 8 طرق لمستويات تسجيل مختلفة: emergency، alert، critical، error، warning، notice، info، debug.
أشهر تطبيق لـ PSR-3 هو مكتبة Monolog. إنها مرنة وقوية ومدعومة من قبل جميع الأطر الحديثة تقريبًا (Laravel، Symfony، Yii2).
تثبيت Monolog عبر Composer
composer require monolog/monologمثال أساسي للاستخدام
<?phprequire 'vendor/autoload.php';
use Monolog\\Logger;use Monolog\\Handler\\StreamHandler;
// إنشاء مسجل باسم قناة (مثلاً، 'my_app')$log = new Logger('my_app');// إضافة معالج: الكتابة إلى ملف، المستوى - INFO وما فوق$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Logger::INFO));
// تسجيل الرسائل$log->info('المستخدم قام بتسجيل الدخول', ['user_id' => 123]);$log->warning('كلمة مرور غير صحيحة', ['attempts' => 3]);$log->error('خطأ في الاتصال بقاعدة البيانات', ['exception' => $e->getMessage()]);?>لاحظ: الوسيطة الثانية هي السياق (context). يمكنك تمرير أي بيانات إضافية فيه: معرف المستخدم، IP، تتبع الاستدعاءات (stack trace) إلخ. لا تقم أبدًا بدمج البيانات في سلسلة الرسالة - استخدم السياق.
2. مستويات التسجيل والتصفية
استخدام المستويات الصحيحة هو أساس السجل المقروء. القاعدة العامة: كلما ارتفع المستوى، قلّت الرسائل. إليك ورقة غش مختصرة:
- DEBUG (100) — معلومات تصحيح الأخطاء للتطوير. عادة ما يكون معطلاً في بيئة الإنتاج.
- INFO (200) — أحداث مهمة: مستخدم مسجل، طلب تم إنشاؤه.
- NOTICE (250) — أحداث عادية ولكنها هامة.
- WARNING (300) — حالة غير طبيعية، لكن التطبيق يستمر في العمل (مثل محاولة تسجيل دخول فاشلة).
- ERROR (400) — خطأ يتطلب تدخلاً (فشل حفظ ملف).
- CRITICAL (500) — خطأ حرج (قاعدة البيانات غير متاحة).
- ALERT (550) — يتطلب إجراءً فوريًا.
- EMERGENCY (600) — النظام غير قابل للتشغيل.
التصفية في بيئات مختلفة
في بيئة الإنتاج، لا حاجة لكتابة رسائل DEBUG - فهي تخلق حملاً إضافيًا على القرص وتجعل من الصعب العثور على السجلات المهمة. استخدم معالجات مختلفة لبيئات مختلفة:
<?phpuse Monolog\\Logger;use Monolog\\Handler\\StreamHandler;use Monolog\\Handler\\FingersCrossedHandler;
$log = new Logger('app');
if (getenv('APP_ENV') === 'production') { // في الإنتاج، نكتب فقط WARNING وما فوق $log->pushHandler(new StreamHandler('/var/log/app/error.log', Logger::WARNING)); // FingersCrossedHandler: يخزن كل شيء مؤقتًا، لكنه يكتب فقط عند حدوث خطأ $log->pushHandler(new FingersCrossedHandler( new StreamHandle