إدارة أنظمة لينكس

السجلات وجورنال‌د

18 دقيقة الدرس 2 من 28

السجلات وجورنال‌د

حين يتصرف نظام إنتاجي بشكل غير متوقع — يتعطل سرفس، تنتهي مهلة طلب، أو ينتهي نشر بصمت تام — يكون السؤال الأول دائمًا: ماذا يقول السجل؟ السجلات هي السطح التشخيصي الأول في كل نظام لينوكس، وإتقانها أمر لا مفر منه في عمل DevOps. يغطي هذا الدرس منظومتي التسجيل التكامليتين اللتين ستصادفهما على كل مضيف لينوكس حديث: journald الخاص بـ systemd، وحزمة syslog التقليدية، إضافةً إلى مواقع ملفات السجل الأساسية التي يجب أن تحفظها عن ظهر قلب.

كيف يعمل التسجيل في لينوكس: طبقتان

على نظام حديث يعمل بـ systemd، تتدفق السجلات عبر قناتين متوازيتين:

  • journald (/usr/lib/systemd/systemd-journald) — عفريت دفتر يومية systemd. يلتقط كل ما يمر عبر حلقة مخزن النواة (dmesg)، ومدخلات السجل المنظم من وحدات systemd، وأي مخرجات تُكتب في stdout/stderr من الخدمات المُدارة. يخزن السجلات بصيغة ثنائية مفهرسة في /run/log/journal/ (متطايرة) أو /var/log/journal/ (دائمة).
  • rsyslog / syslog-ng — عفريت syslog نصي تقليدي يعمل بالتوازي على معظم التوزيعات. يستطيع journald إعادة توجيه الرسائل إليه عبر مقبس، مما ينتج الملفات النصية المألوفة تحت /var/log/.
نقطة جوهرية: في RHEL/CentOS/Fedora، يكون حفظ journald الدائم مفعَّلًا افتراضيًا (تبقى السجلات بعد إعادة التشغيل). أما في Debian/Ubuntu، فالافتراضي هو التخزين المتطاير — تعيش السجلات في الذاكرة وتضيع عند إعادة التشغيل — ما لم تُنشئ مجلد الحفظ الدائم يدويًا أو تضبط Storage=persistent في /etc/systemd/journald.conf.

تفعيل تخزين دفتر اليومية الدائم

أول ما تتحقق منه على أي خادم جديد هو ما إذا كان دفتر اليومية يبقى بعد إعادة التشغيل. يمكنك التحقق بالبحث عن /var/log/journal/:

# التحقق من تفعيل التخزين الدائم ls /var/log/journal/ # إن كان المجلد غائبًا، أنشئه وأعد تشغيل journald mkdir -p /var/log/journal systemd-tmpfiles --create --prefix /var/log/journal systemctl restart systemd-journald # بديلًا، يمكنك الضبط الصريح في الإعدادات # عدّل /etc/systemd/journald.conf وأضف: # Storage=persistent # ثم: systemctl restart systemd-journald

journalctl: الأداة المثلى لكل استعلام عن السجلات

journalctl هو واجهة سطر الأوامر لـ journald. في بيئات الشركات الكبرى ستستخدمه مئات المرات أسبوعيًا — تعلم مرشحاته بعمق.

# --- استعلامات أساسية --- journalctl # كل السجلات، الأقدم أولًا (مع ترقيم) journalctl -e # الانتقال للنهاية (الأحدث) journalctl -f # متابعة المدخلات الجديدة فور وصولها (مثل tail -f) journalctl -n 100 # آخر 100 سطر # --- الفلترة حسب الوحدة (الخدمة) --- journalctl -u nginx # كل سجلات وحدة nginx journalctl -u nginx -f # متابعة سجلات nginx journalctl -u nginx -u postgresql # وحدات متعددة في آن واحد # --- الفلترة حسب الوقت --- journalctl --since "2025-06-10 08:00:00" journalctl --since "1 hour ago" journalctl --since yesterday --until "06:00" journalctl -u sshd --since "2025-06-10" --until "2025-06-11" # --- الفلترة حسب الأولوية (مستويات syslog 0-7) --- journalctl -p err # الأخطاء فما فوق (err, crit, alert, emerg) journalctl -p warning -u kubelet # تحذيرات+ لـ kubelet # --- الفلترة حسب الحقل (التسجيل المنظم) --- journalctl _PID=1234 # سجلات من PID محدد journalctl _UID=0 # سجلات من عمليات الجذر journalctl _SYSTEMD_UNIT=sshd.service PRIORITY=4 # شروط AND # --- تنسيقات المخرجات --- journalctl -u nginx -o json-pretty # مخرجات JSON منظمة journalctl -u nginx -o cat # نص الرسالة الخام فقط (مثالي للـ grep) journalctl --no-pager | grep FAILED # مناسب للأنابيب (تعطيل الترقيم) # --- استخدام القرص --- journalctl --disk-usage journalctl --vacuum-size=500M # تقليص دفتر اليومية إلى 500 ميغابايت journalctl --vacuum-time=30d # حذف المدخلات الأقدم من 30 يومًا
ممارسة احترافية — مخرجات JSON للأتمتة: حين تحتاج إلى تحليل السجلات في سكريبت أو توجيهها إلى مجمِّع سجلات، استخدم -o json. يخزن journald بيانات وصفية غنية (PID، UID، اسم الأمر، معرف التشغيل، الطابع الزمني الأحادي) في كل مدخلة — حقول يفقدها نص syslog العادي. تمتلك أدوات مثل Filebeat وFluentd مكونات إدخال journald أصيلة تستغل هذه البيانات المنظمة.

مخطط تدفق السجلات

Linux log flow: sources to storage and consumers Kernel / dmesg systemd units (stdout/stderr) syslog() syscall (apps, libs) audit / kernel audit events journald /var/log/journal/ (binary, indexed) rsyslog / syslog-ng /var/log/*.log (text) journalctl CLI query tool Filebeat / Fluentd to Elasticsearch / Loki
تدفق السجلات على مضيف لينوكس حديث: تتجمع كل المصادر في journald، الذي يُعيد توجيهها إلى rsyslog (ملفات نصية) ويخدم البيانات المنظمة لـ journalctl وناقلات السجلات.

Syslog التقليدي: مواقع ملفات السجل الأساسية

حتى في عالم تهيمن عليه journald، تظل ملفات السجل النصية أساسية — يمكن قراءتها دون أدوات، وتخضع للـ grep بسهولة، وتستهلكها عشرات العوامل القديمة. احفظ هذه المسارات على كل توزيعة:

الملف / المسار ما يحتويه
/var/log/syslog (Debian/Ubuntu) رسائل النظام العامة؛ السجل الشامل
/var/log/messages (RHEL/CentOS) مكافئ syslog في عائلة Debian
/var/log/auth.log (Debian/Ubuntu) أحداث المصادقة: تسجيل دخول SSH، sudo، PAM
/var/log/secure (RHEL/CentOS) مكافئ auth.log في عائلة Debian
/var/log/kern.log رسائل النواة (OOM killer، أخطاء أجهزة، مشغّل الشبكة)
/var/log/dmesg لقطة حلقة مخزن النواة عند الإقلاع
/var/log/dpkg.log / yum.log سجل تثبيت/إزالة الحزم
/var/log/nginx/، /var/log/apache2/ سجلات وصول وأخطاء خادم الويب (خاصة بالتطبيق)
/var/log/audit/audit.log أحداث إطار التدقيق في لينوكس (SELinux، تدقيق استدعاءات النظام)

قراءة السجلات بفاعلية: أنماط وتقنيات

قد يصل حجم السجلات الخام على خادم مشغول إلى ملايين الأسطر يوميًا. قراءة السجلات بفاعلية تعني تضييق نطاق البحث بسرعة:

# متابعة syslog وتمييز الأخطاء في الوقت الفعلي tail -f /var/log/syslog | grep --color -i "error\|fail\|crit" # إيجاد كل فشل مصادقة SSH منذ آخر إقلاع journalctl -u sshd -b -p warning # عدّ محاولات sudo الفاشلة اليوم grep "authentication failure" /var/log/auth.log | grep "$(date +%b\ %e)" | wc -l # البحث عن قتل OOM (استدعاءات قاتل نفاد الذاكرة) journalctl -k | grep -i "oom\|killed process" # أو: dmesg -T | grep -i "oom\|out of memory" # فحص ما حدث حول طابع زمني محدد (±5 دقائق) journalctl --since "2025-06-10 14:25:00" --until "2025-06-10 14:35:00" -p info # عرض سجلات الإقلاع السابق (عند تصحيح أخطاء عطل/إعادة تشغيل) journalctl -b -1 # الإقلاع السابق journalctl --list-boots # كل الإقلاعات المتاحة مع طوابعها الزمنية # البحث في سجل مضغوط مؤرشف zgrep "FAILED" /var/log/syslog.2.gz

تدوير السجلات مع logrotate

تنمو ملفات السجل النصية بلا حدود من دون تدوير. logrotate هو العفريت المعياري الذي يضغط ويعيد تسمية ويحذف السجلات القديمة وفق جدول زمني. يُضبط في /etc/logrotate.conf وفي ملفات مخصصة لكل خدمة داخل /etc/logrotate.d/. إليك إعدادًا نموذجيًا لسجل تطبيق:

# /etc/logrotate.d/myapp /var/log/myapp/*.log { daily rotate 14 compress delaycompress missingok notifempty sharedscripts postrotate systemctl reload myapp > /dev/null 2>&1 || true endscript }
مزلق إنتاجي — امتلاء قرص journald: على الأنظمة ذات الحركة العالية، يمكن لـ journald أن يملأ القرص بسرعة مدهشة إن لم يُضبط تحديد معدل الرسائل. بشكل افتراضي، يُطبق journald تحديدًا للانفجار (RateLimitIntervalSec=30s، RateLimitBurst=10000) ويحدد حجم دفتر اليومية بـ 10% من نظام الملفات. احرص دائمًا على ضبط حدود صريحة في /etc/systemd/journald.conf: استخدم SystemMaxUse=2G وSystemKeepFree=500M حتى لا يحرم دفتر اليومية تطبيقك من مساحة القرص. نفِّذ journalctl --disk-usage دوريًا ضمن دفاتر المراقبة.

التوجيه إلى منصة تجميع مركزية للسجلات

سجلات الخادم الفردية مفيدة للفرز السريع، لكن على النطاق الواسع — عشرات المضيفين والميكروسرفيسز وحاويات Kubernetes — لا بد من نقل السجلات إلى منصة مركزية. المنظومة الإنتاجية المعيارية هي:

  • Filebeat أو Fluentd/Fluent Bit — عوامل خفيفة الوزن تتابع الملفات أو تقرأ دفتر اليومية مباشرةً (مكوّن إدخال journald) وتُعيد التوجيه إلى خادم خلفي.
  • Elasticsearch + Kibana (ELK/EFK) — منظومة البحث النصي الكامل والتصور الكلاسيكية. مُكلفة التشغيل على النطاق الواسع.
  • Grafana Loki — مخزن السجلات السحابي الأصيل القائم على التسميات. أقل تكلفةً بكثير من Elasticsearch لأنه يُفهرس بيانات وصفية التسميات فقط لا النص الكامل. متكامل مع Prometheus وGrafana — الخيار المفضل للنشر الجديد على الأرض البكر.

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

ممارسة احترافية — تحقق دائمًا من السجلات عبر النطاقات الثلاث عند تشخيص عطل: (1) journalctl -u <service> -n 50 لمخرجات الخدمة الخاصة؛ (2) journalctl -k -b للمشكلات على مستوى النواة (OOM، الأجهزة)؛ (3) /var/log/auth.log أو /var/log/secure إن تضمّن العطل صلاحيات أو PAM أو SSH. معظم أعطال الإنتاج تترك أثرًا في واحد من هذه النطاقات الثلاثة على الأقل.