Telescope و Log Viewer: كيف تراقب تطبيق Laravel في الإنتاج بأمان
عندما يتعطل تطبيقك في الإنتاج، أول سؤال هو: ماذا حدث بالضبط؟ أداتان تجيبان عن هذا السؤال في Laravel: Telescope وLog Viewer. لكن وضعهما في الإنتاج بلا حماية قد يحوّلهما من أداة مراقبة إلى ثغرة.
ما الفرق بينهما؟
- Telescope: يسجّل ما يمرّ عبر التطبيق: الطلبات، الاستثناءات، الاستعلامات، الـ jobs، الرسائل البريدية. مناسب لفهم سلسلة الأحداث خلف مشكلة معيّنة.
- Log Viewer: واجهة لقراءة ملفات
storage/logsوتصفيتها حسب المستوى والتاريخ والبحث النصي. مناسب عندما تريد قراءة السجل بسرعة بدون SSH.
القاعدة الأولى: لا تعتمد على تسجيل الدخول وحده
خطأ شائع هو حماية الأداتين بـ auth فقط. إن كان التسجيل مفتوحًا، فأي شخص ينشئ حسابًا يصبح "مصادَقًا". الصحيح أن تربط الصلاحية بحقل صريح مثل is_admin:
Gate::define('viewTelescope', fn (User $user) => $user->is_admin === true);
LogViewer::auth(fn ($request) => $request->user()?->is_admin === true);
وتذكّر أن لكل أداة واجهة بيانات (API) مستقلة عن الصفحة، فتأكد أنها محميّة بالشرط نفسه.
القاعدة الثانية: سجّل أقل في الإنتاج
تسجيل كل شيء يملأ قاعدة البيانات ويبطّئ التطبيق. في الإنتاج اكتفِ بما يهمّك:
Telescope::filter(fn (IncomingEntry $entry) =>
$this->app->environment('local')
|| $entry->isReportableException()
|| $entry->isFailedRequest()
|| $entry->isFailedJob()
|| $entry->isSlowQuery()
);
القاعدة الثالثة: أخفِ الأسرار
كلمات المرور والـ cookies والـ tokens يجب ألا تظهر في السجل. استخدم Telescope::hideRequestParameters() وhideRequestHeaders()، واستثنِ المسارات التي تحمل رموزًا سرية في الرابط نفسه (مثل روابط تأكيد الاشتراك وإلغائه) عبر ignore_paths.
القاعدة الرابعة: نظّف دوريًا
جدول telescope_entries يكبر بسرعة. جدوِل الأمر telescope:prune --hours=72 يوميًا، وإن كانت منصتك لا تشغّل الـ scheduler فشغّله يدويًا من وقت لآخر.
الخلاصة
- الأداتان للأدمن فقط، وبشرط صريح لا بمجرد تسجيل الدخول.
- سجّل الأخطاء والبطء فقط في الإنتاج.
- أخفِ الأسرار واستثنِ الروابط الحساسة.
- نظّف البيانات القديمة بانتظام.
بهذه الخطوات الأربع تحصل على رؤية كاملة لما يجري في تطبيقك دون أن تفتح بابًا جديدًا للمهاجمين.