سجلاتنا كانت ضجيجًا بلا معنى: كيف أنقذتنا ‘إدارة السجلات المركزية’ من جحيم البحث عن إبرة في كومة قش؟

يا جماعة الخير، السلام عليكم. خليني أحكيلكم قصة صارت معي قبل كم سنة، قصة علمتني درس ما بنساه. كنا في نص الليل، وفنجان الشاي بالنعناع جنبي برد شوي شوي، وأنا وزملائي في الفريق بنحاول نحل مشكلة “عويصة” في واحد من أكبر تطبيقاتنا. التطبيق فجأة صار بطيء جدًا، وبعض المستخدمين بتصلهم رسائل خطأ غريبة، وإحنا مش فاهمين الطبخة.

المشكلة كانت إنه تطبيقنا عبارة عن مجموعة من الخدمات المصغرة (Microservices)، وكل خدمة شغالة على خادم أو حاوية (container) لحالها. يعني عشان نعرف شو اللي بصير، كان لازم أفوت بـ SSH على كل خادم، وأفتح ملفات السجلات (logs)، وأقعد أعمل grep و tail و awk وأدوات سحرية تانية عشان ألاقي طرف خيط. كنت أحس حالي بدور على إبرة في عشرين كومة قش، مش كومة واحدة! أفتح سجل خدمة المستخدمين، وأشوف طلب معين، بعدين آخذ الـ ID تبعه وأروح أركض على سجل خدمة الطلبات وأبحث عنه، وبعدها على سجل خدمة الدفع… قصة طرمة، وساعات بتضيع والضغط بيزيد والعميل على التلفون مش ساكت.

في هذيك الليلة، وبعد 4 ساعات من البحث المضني، اكتشفنا المشكلة: كانت خدمة ثالثة صغيرة ما حدا منتبه عليها بتعاني من خطأ في الاتصال بقاعدة البيانات، وهالشي كان يعمل تأثير الدومينو على باقي النظام. وقتها قلت لحالي: “لهون وبس! لازم يكون في طريقة أحسن من هيك”. ومن هنا بدأت رحلتنا مع ما يسمى بـ “إدارة السجلات المركزية”.

ما قبل السجلات المركزية: فوضى في كل مكان

قبل ما نغوص في الحل، خلينا نوصف المشكلة بشكل أوضح للمبرمجين الجداد. كل تطبيق، كل خادم، كل قطعة برمجية بتشتغل، بتنتج “سجلات” (Logs). هاي السجلات هي عبارة عن رسائل نصية بتوصف شو اللي بصير: “تم تسجيل دخول المستخدم فلان”، “حدث خطأ أثناء الاتصال بقاعدة البيانات”، “تم استلام طلب جديد”، وهكذا.

في الوضع التقليدي، كل خدمة بتكتب سجلاتها في ملف على نفس الخادم اللي هي شغالة عليه. وهذا ممتاز لو عندك تطبيق واحد على خادم واحد. لكن في عالم اليوم، أنظمتنا معقدة وموزعة:

  • عشرات أو مئات الخدمات المصغرة (Microservices).
  • حاويات (Containers) مثل Docker و Kubernetes بتظهر وبتختفي.
  • خوادم سحابية (Cloud Servers) ممكن تتغير عناوينها.
  • موازنات تحميل (Load Balancers)، قواعد بيانات، خدمات تخزين مؤقت (Caching)… كلها بتنتج سجلات.

لما تحدث مشكلة، بتبدأ المعاناة. بدك تجمع السجلات من كل هاي المصادر، وتوحد التوقيت الزمني بينها (مشكلة كبيرة بحد ذاتها!)، وبعدين تبدأ تحلل. هذا بالضبط هو “البحث عن إبرة في كومة قش”.

الحل السحري: ما هي إدارة السجلات المركزية (Centralized Logging)؟

ببساطة شديدة، إدارة السجلات المركزية هي استراتيجية ومنظومة تقنية هدفها جمع كل السجلات من كل مصادرك المختلفة (تطبيقات، خوادم، شبكات، قواعد بيانات) في مكان واحد مركزي، آمن، وقابل للبحث.

تخيل معي بدل ما تفوت على 20 خادم، بتفتح واجهة واحدة جميلة، وبتكتب فيها: “أعطيني كل السجلات اللي فيها كلمة ‘Error’ خلال آخر ساعة من كل الخدمات اللي الها علاقة بالمستخدم ‘123’”. وخلال ثواني، بتظهرلك النتيجة مرتبة ومنظمة. هذا بطل سحر، هذا صار واقع.

كيف تعمل هذه المنظومة؟

أي نظام إدارة سجلات مركزي بتكون من عدة أجزاء رئيسية بتشتغل مع بعضها:

  1. الناقل (Shipper/Agent): هو برنامج خفيف بتثبته على كل خادم أو حاوية. وظيفته يراقب ملفات السجلات أو يستقبلها من تطبيقك، ويقوم بإرسالها إلى المكان المركزي. أشهر الأمثلة: Filebeat, Fluentd, Promtail.
  2. المُجمّع/المُعالج (Aggregator/Processor): هو الخادم المركزي اللي بيستقبل السجلات من كل الـ Agents. وظيفته إنه “يفصفص” السجل، يعني يحلل الرسالة النصية ويحولها لبيانات مهيكلة (Structured Data). مثلاً، يحلل سطر سجل Nginx ويستخرج منه عنوان IP، ونوع الطلب، وحالة الاستجابة، إلخ. أشهر الأمثلة: Logstash, Fluentd.
  3. التخزين والبحث (Storage & Search Backend): هي قاعدة بيانات ضخمة مصممة خصيصاً لتخزين كميات هائلة من البيانات النصية والبحث فيها بسرعة فائقة. أشهر الأمثلة: Elasticsearch, Loki.
  4. واجهة العرض (Visualization UI): هي الواجهة الرسومية اللي بتستخدمها أنت كمطور للبحث في السجلات، وإنشاء رسوم بيانية (Dashboards)، وإعداد تنبيهات (Alerts). أشهر الأمثلة: Kibana, Grafana.

المنظومة باختصار: [خادم 1: Agent] –يرسل–> [خادم مركزي: Processor] –يحلل ويخزن في–> [قاعدة بيانات: Storage] <–أنت تبحث عبر– [واجهة رسومية: UI]

“ورجينا الشغل يا أبو عمر”: مثال عملي باستخدام حزمة ELK

من أشهر الحزم المستخدمة في هذا المجال هي حزمة ELK (أو Elastic Stack)، واللي بتتكون من Elasticsearch و Logstash و Kibana. خلينا نشوف مثال مبسط كيف ممكن نربطهم مع بعض.

الخطوة الأولى: إرسال السجلات مع Filebeat

لنفترض عنا خادم ويب Nginx وبدنا نجمع سجلات الدخول (access logs). أول شي بنثبت Filebeat على الخادم، وبنعدّل ملف الإعدادات filebeat.yml:


filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log

# ... إعدادات أخرى ...

output.logstash:
  hosts: ["your-logstash-server:5044"]

هذا الإعداد البسيط بخبر Filebeat إنه يراقب ملف access.log الخاص بـ Nginx، وأي سطر جديد ينضاف عليه، يبعثه مباشرة إلى خادم Logstash على البورت 5044.

الخطوة الثانية: معالجة السجلات مع Logstash

على الخادم المركزي، Logstash بستنى السجلات. ملف الإعدادات تبعه logstash.conf ممكن يكون شكله كالتالي:


input {
  beats {
    port => 5044
  }
}

filter {
  # إذا كان السجل قادمًا من ملف Nginx
  if "nginx" in [source] {
    grok {
      # هذا النمط السحري يحلل سطر سجل Nginx
      match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} [%{HTTPDATE:timestamp}] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} %{NUMBER:bytes:int} "%{DATA:referrer}" "%{DATA:agent}"" }
    }
    # تحويل حقل التاريخ إلى تاريخ حقيقي
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
  }
}

output {
  elasticsearch {
    hosts => ["http://your-elasticsearch-server:9200"]
    index => "nginx-logs-%{+YYYY.MM.dd}"
  }
}

شو اللي صار هون؟

  • Input: استقبلنا البيانات من Filebeat.
  • Filter: هاي هي منطقة السحر. استخدمنا فلتر grok عشان “نفصفص” رسالة السجل النصية (message) ونحولها لحقول منفصلة مثل clientip, verb, response.
  • Output: أرسلنا البيانات المهيكلة والجميلة إلى Elasticsearch وخزناها في فهرس (index) يومي.

الخطوة الثالثة: البحث والعرض مع Kibana

الآن، كل سجلات Nginx موجودة في Elasticsearch بشكل مهيكل. بنفتح واجهة Kibana، وبنروح على قسم “Discover”. هون بنقدر نعمل العجايب. مثلاً:

  • للبحث عن كل الأخطاء من نوع “Internal Server Error” (code 500):
    response: 500
  • للبحث عن كل طلبات POST اللي فشلت:
    verb: "POST" AND response: >=400
  • للبحث عن نشاط IP معين:
    clientip: "123.45.67.89"

وبتقدر تبني رسوم بيانية تفرجيك أكثر الـ IP اللي بتعمل طلبات، أو توزيع أكواد الاستجابة على مدار الوقت، أو أكثر الصفحات اللي بترجع أخطاء. صار عندك رؤية كاملة بدل ما كنت أعمى.

نصائح من دفتر “أبو عمر” العتيق

بعد سنوات من الشغل مع هاي الأنظمة، تعلمت كم شغلة بتمنى حدا كان حكالي إياها من البداية:

  1. السجلات المهيكلة (Structured Logging) هي الأصل: بدل ما تخلي تطبيقك يكتب سجلات نصية عادية ويجي Logstash يحللها، خليه من الأساس يكتب السجلات بصيغة JSON. هذا بريحك من صداع الـ grok وبخلي العملية أسرع وأكثر دقة.

    مثال (قبل): "User 123 failed to login."

    مثال (بعد، JSON): {"level": "WARN", "message": "User failed to login", "user_id": 123, "source_ip": "1.2.3.4"}
  2. لا تسجل معلومات حساسة: إياك ثم إياك تسجل كلمات سر، مفاتيح API، معلومات بطاقات ائتمان، أو أي بيانات شخصية للمستخدمين في السجلات. هاي كارثة أمنية. استخدم فلاتر في Logstash أو في تطبيقك نفسه لحذف أو إخفاء (mask) هاي المعلومات.
  3. السياق هو الملك (Context is King): لما تسجل أي شي، ضيف معه معلومات سياق مفيدة. أهم معلومة هي request_id أو correlation_id. هاي عبارة عن مُعرّف فريد بتعطيه للطلب أول ما يدخل نظامك، وبتمرره لكل الخدمات المصغرة اللي بتشارك في معالجة هذا الطلب. هيك، بكبسة زر بتقدر تشوف رحلة الطلب الواحد عبر كل النظام.
  4. استخدم مستويات السجلات (Log Levels) بحكمة: فرّق بين DEBUG (للمعلومات التفصيلية أثناء التطوير)، INFO (للأحداث العادية في الإنتاج)، WARN (لأشياء غريبة بس مش كارثية)، و ERROR/FATAL (للمصايب). هذا بسمحلك في بيئة الإنتاج إنك تفلتر وتشوف فقط الـ WARN وما فوق، وتقلل من الضجيج.

الخلاصة: من كومة قش إلى منجم ذهب 💎

الاستثمار في منظومة إدارة سجلات مركزية مش رفاهية، هو ضرورة مطلقة لأي نظام برمجي حديث. هالشغلة بتحول سجلاتك من مجرد ضجيج لا معنى له مبعثر في كل مكان، إلى مصدر غني بالمعلومات ومنجم ذهب للبيانات التشغيلية.

نعم، الإعداد الأولي بده شوية شغل، لكن العائد على المدى الطويل ضخم جدًا: تقليل وقت حل المشاكل من ساعات إلى دقائق، القدرة على فهم سلوك نظامك بشكل أفضل، وإمكانية اكتشاف المشاكل بشكل استباقي قبل ما المستخدم يحس فيها. نصيحتي لكل فريق تطوير، صغير كان أو كبير: ابدأوا اليوم. حتى لو كان مجرد خادم واحد بسيط يشغل حزمة ELK أو PLG، رح تشكروني لاحقًا. صدقوني، نومكم بالليل رح يصير أهدا بكثير.

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

التكنلوجيا المالية Fintech

بياناتنا المالية كانت سجينة في قلاع منيعة: كيف حررتنا ‘الخدمات المصرفية المفتوحة’ من جحيم الأنظمة المغلقة؟

أنا أبو عمر، مطور برمجيات فلسطيني، وأروي لكم كيف انتقلت بياناتنا المالية من سجون رقمية مغلقة إلى عالم مفتوح من الابتكار بفضل "الخدمات المصرفية المفتوحة"....

20 أبريل، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

فريقنا كان يعيش في خوف: كيف أنقذتنا ‘السلامة النفسية’ من جحيم ثقافة اللوم والأخطاء المدفونة؟

مقالة تستعرض كيف يمكن لثقافة اللوم أن تدمر الفرق البرمجية، وكيف يمكن لمفهوم 'السلامة النفسية' أن يحول بيئة العمل من الخوف إلى الإبداع. تجربة شخصية...

20 أبريل، 2026 قراءة المزيد
اختبارات الاداء والجودة

نظامنا كان هشًا كبيت من ورق: كيف أنقذتنا ‘هندسة الفوضى’ (Chaos Engineering) من جحيم الأعطال؟

أتذكرها جيدًا، "ليلة الخميس الحزينة"، حين انهار نظامنا بالكامل في أهم أوقات الذروة. هذه المقالة هي قصة كيف انتقلنا من إطفاء الحرائق المستمر إلى بناء...

20 أبريل، 2026 قراءة المزيد
أتمتة العمليات

تقاريرنا اليومية كانت سباقًا مع الزمن: كيف أنقذتنا ‘منصات تنسيق المهام’ (Workflow Orchestration) من جحيم العمليات اليدوية؟

أشارككم قصة حقيقية من قلب معاناتنا اليومية مع تقارير البيانات، وكيف تحولنا من الفوضى والعمليات اليدوية المرهقة إلى نظام مؤتمت بالكامل باستخدام منصات تنسيق المهام...

20 أبريل، 2026 قراءة المزيد
​معمارية البرمجيات

الميكروسيرفس كانت حلمًا تحول لكابوس: كيف أنقذنا “المونوليث النمطي” من جحيم التعقيد الموزع؟

بتذكرها زي كأنها مبارح، جلسة العصف الذهني الحماسية لفريقنا وهو يقرر تبني معمارية الميكروسيرفس. كانت تبدو كالجنة، لكنها سرعان ما تحولت لجحيم من التعقيد الموزع....

20 أبريل، 2026 قراءة المزيد
ذكاء اصطناعي

روبوت الدردشة لدينا كان كاذبًا محترفًا: كيف أنقذتنا قواعد البيانات المتجهية و RAG من جحيم الهلوسة؟

أشارككم قصة حقيقية عن روبوت دردشة كاد أن يدمر سمعة أحد عملائنا بسبب "هلوساته" وكذبه المستمر. سأشرح لكم بالتفصيل كيف تمكنا من ترويضه وتحويله إلى...

19 أبريل، 2026 قراءة المزيد
خوارزميات

من كارثة توصيات الطرق إلى سحر ‘دكسترا’: كيف أنقذتنا الخوارزميات من جحيم المسارات غير المثالية

في هذه المقالة، يشارك أبو عمر، مطور برمجيات فلسطيني، قصة حقيقية عن فشل نظام توصيات المسارات في أحد المشاريع، وكيف كانت "خوارزمية دكسترا" هي المنقذ....

19 أبريل، 2026 قراءة المزيد
البودكاست