تطبيق PHP الخاص بك لا يتحدث، إنه يصرخ
\n\nتخيل أنك قائد سفينة فضائية. مهمتك هي الوصول إلى المريخ. لكن لا توجد أجهزة قياس على السفينة، ولا حساسات، ولا حتى زر "إنذار طوارئ". أنت فقط تطير، على أمل الأفضل. هذا تقريبًا ما يشعر به المطور الذي يشغل تطبيق PHP في بيئة الإنتاج دون مراقبة أو تسجيل.
\n\nيرى المستخدمون "500 Internal Server Error"، بينما ترى أنت شاشة سجلات فارغة. هل هذا مألوف؟ إذا لم يكن كذلك، فأنت إما عبقري، أو لم تواجه بعد انهيار خادم إنتاجي في الساعة الثالثة صباحًا.
\n\nفي هذه المقالة، سنشرح كيف تحول تطبيق PHP الخاص بك من "صندوق أسود" إلى نظام شفاف يخبرك بنفسه أين ولماذا تعطل. سأعرض كودًا حقيقيًا، وأفضل الممارسات، والأدوات التي تستخدمها المشاريع الكبيرة في بيئة الإنتاج. هيا بنا.
\n\nلماذا التسجيل في PHP ليس مجرد "echo"
\n\nيعتقد العديد من المبتدئين أن التسجيل هو:
\n\necho "هذا خطأ: " . $error;\n\nمفسد: هذا لا يعمل في بيئة الإنتاج. سيرى المستخدم هذه "التحفة" على الشاشة. وإذا كان الخطأ قاتلاً، فلن تعلم به أبدًا.
\n\nالتسجيل الحقيقي هو جمع منظم للبيانات يمكن تحليلها والبحث فيها والاستجابة لها في الوقت الفعلي. توفر PHP دوالًا أساسية (error_log(), syslog())، لكن هذا غير كافٍ في العالم الحديث.
ماذا يجب أن يحتوي السجل الجيد؟
\n- \n
- مستوى الخطورة — DEBUG, INFO, WARNING, ERROR, CRITICAL \n
- الطابع الزمني — الوقت الدقيق للحدث (يفضل بتوقيت UTC) \n
- السياق — معرف المستخدم، IP، URL، بيانات الطلب \n
- تتبع الاستدعاءات — trace الخطأ \n
- معرف فريد للطلب — لربط جميع سجلات الإجراء الواحد \n
Monolog — معيار التسجيل في PHP
\n\nإذا كنت تكتب بلغة PHP ولا تستخدم Monolog، فأنت تضيع وقتك. هذا هو المعيار الفعلي للتسجيل، والذي تدعمه Symfony وLaravel ومعظم الأطر الحديثة.
\n\nلماذا Monolog رائع؟
\n- \n
- معالجات (handlers) مرنة — يمكن الكتابة إلى ملف، قاعدة بيانات، Telegram، Slack، بريد إلكتروني \n
- مُنسِّقات — JSON, HTML, Syslog \n
- معالجات (Processors) — تضيف السياق تلقائيًا \n
التثبيت ومثال أساسي
\n\ncomposer require monolog/monolog\n\nوالآن لنكتب مسجلاً بسيطًا:
\n\n<?php\nrequire 'vendor/autoload.php';\n\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\TelegramBotHandler;\nuse Monolog\\Level;\n\n// إنشاء مسجل باسم القناة\n$log = new Logger('my_app');\n\n// الكتابة إلى ملف\n$log->pushHandler(\n new StreamHandler(__DIR__ . '/logs/app.log', Level::Debug)\n);\n\n// الأخطاء الحرجة — إلى Telegram\n$log->pushHandler(\n new TelegramBotHandler(\n 'YOUR_BOT_TOKEN',\n 'YOUR_CHAT_ID',\n Level::Critical\n )\n);\n\n// الاستخدام\n$log->info('المستخدم سجل الدخول', ['user_id' => 123]);\n$log->error('قاعدة البيانات غير متاحة', ['db_host' => 'localhost']);\n\nلاحظ: نستخدم معالجات مختلفة لمستويات مختلفة. يُكتب كل شيء (التصحيح) إلى الملف، بينما يُرسل إلى Telegram فقط الحرجة. هذا يسمح بعدم إغراق الإشعارات، مع عدم تفويت المشكلة الحقيقية.
\n\nمراقبة PHP: كيف ترى ما هو مخفي
\n\nالتسجيل هو جمع بيانات سلبي. المراقبة هي ملاحظة نشطة وإخطار. إذا أخبرك المستخدم بوجود خطأ، فقد فات الأوان. المراقبة الجيدة ستحذرك قبل أن تؤثر المشكلة على المستخدمين.
\n\nSentry — أمر لا غنى عنه لمطور PHP
\n\nSentry هو نظام تتبع الأخطاء في الوقت الفعلي. يلتقط الاستثناءات، ويجمع السياق، وتتبع الاستدعاءات، وحتى بيانات الجلسة.