تطبيقك صامت؟ هذه علامة خطيرة
\n\nهل سبق لك أن عرفت بوجود خطأ في الإنتاج (Production) من مستخدم غاضب؟ إذا كان الجواب نعم، فأنت تعلم كم هذا مؤلم. إذا كان لا، فأنت محظوظ (حتى الآن).
\n\nPHP هي اللغة التي تعمل على 78% من جميع مواقع الويب في العالم. لكن لديها ميزة غريبة: إنها "هادئة" جدًا. افتراضيًا، تبتلع PHP الأخطاء بصمت، أو تعرض صفحة بيضاء، أو الأسوأ من ذلك، تستمر في العمل ببيانات خاطئة. بدون نظام مراقبة وتسجيل، أنت أعمى.
\n\nفي هذا المقال، سنشرح كيف تحول تطبيق PHP الخاص بك من "صندوق أسود" إلى نظام شفاف، حيث يتم تسجيل كل خطأ، وكل طلب بطيء، وكل نشاط مشبوه. هيا بنا!
\n\nلماذا "echo $error" ليس تسجيلًا؟
\n\nكثير من المطورين المبتدئين يكتبون:
\n\ntry {\n // بعض الكود\n} catch (Exception $e) {\n echo $e->getMessage();\n}\n\n\nهذا ليس تسجيلًا. هذا صراخ في الفراغ. الطباعة في المتصفح لا تُحفظ، ولا تُنظم، ولا تقدم لك أي تحليلات. التسجيل الحقيقي هو عندما تستطيع:
\n\n- \n
- رؤية الخطأ بعد 5 دقائق من حدوثه \n
- معرفة الخادم والبيئة التي حدث فيها \n
- تصفية آلاف السجلات والعثور على السجل المطلوب \n
- تلقي إشعار فوري في Telegram/Slack عند حدوث عطل \n
لننتقل إلى الأدوات التي تفعل ذلك.
\n\nMonolog — المعيار الفعلي لتسجيل PHP
\n\nإذا كنت تكتب بلغة PHP ولا تستخدم Monolog، فأنت على الأرجح تعيد اختراع العجلة. هذه المكتبة أصبحت المعيار لتسجيل PHP (نعم، Laravel و Symfony تستخدمانها في الخلفية).
\n\nالتثبيت ومثال بسيط
\n\ncomposer require monolog/monolog\n\n\n<?php\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\n\n// إنشاء قناة سجلات\n$log = new Logger('my_app');\n// الكتابة إلى ملف /var/log/my_app.log\n$log->pushHandler(new StreamHandler('/var/log/my_app.log', Logger::WARNING));\n\n// الاستخدام\n$log->warning('هذا تحذير');\n$log->error('خطأ حرج: قاعدة البيانات غير متاحة');\n\n\nهذا أفضل. لكن Monolog يمكنه فعل المزيد. يمكنك إرسال السجلات إلى أماكن مختلفة في نفس الوقت:
\n\n- \n
- إلى ملف — للتصحيح المحلي \n
- إلى Elasticsearch — للبحث المتقدم \n
- إلى Telegram/Slack — للإشعارات العاجلة \n
- إلى Syslog — للإدارة النظامية \n
مثال متقدم مع معالجات متعددة
\n\n<?php\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\TelegramBotHandler;\nuse Monolog\\Handler\\ElasticsearchHandler;\nuse Monolog\\Formatter\\LineFormatter;\n\n$log = new Logger('production');\n\n// كل الأخطاء تُكتب في ملف\n$fileHandler = new StreamHandler('/var/log/app.log', Logger::DEBUG);\n$log->pushHandler($fileHandler);\n\n// الأخطاء الحرجة تُرسل فورًا إلى Telegram\n$telegramHandler = new TelegramBotHandler(\n 'YOUR_BOT_TOKEN', \n 'YOUR_CHAT_ID', \n Logger::CRITICAL\n);\n$telegramHandler->setFormatter(new LineFormatter(\n "[%datetime%] %channel%.%level_name%: %message% %context%\\n"\n));\n$log->pushHandler($telegramHandler);\n\n// التسجيل\n$log->critical('قاعدة البيانات تعطلت', ['server' => gethostname()]);\n\n\nالآن، إذا تعطلت قاعدة البيانات ليلاً، ستعرف فورًا من خلال إشعار على هاتفك. وليس في الصباح من عميل غاضب.
\n\nSentry — مراقبة الأخطاء مع السياق
\n\nMonolog ممتاز في كتابة السجلات، لكن عندما تكثر الأخطاء، مجرد قراءة الملفات يصبح جحيمًا. هنا يأتي دور Sentry — نظام جمع الأخطاء مع واجهة ويب.
\n\nSentry يجمع تلقائيًا:
\n- \n
- تتبع الاستدعاءات (Stack Trace) \n
- بيانات الطلب (URL، الترويسات، المحتوى) \n
- معلومات المستخدم (إذا تم تمريرها) \n
- حالة المتغيرات