تسجيل الدخول في تطبيقات Go: أفضل الممارسات والأدوات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة

التسجيل (Logging) ليس مجرد تسجيل الأحداث في ملف. بالنسبة لتطبيقات Go التي تعمل في بيئات إنتاج عالية التحميل، فإن السجلات (logs) هي المصدر الرئيسي لمعلومات التشخيص. بدون تسجيل عالي الجودة، يتحول البحث عن الأخطاء إلى تخمين، وتصبح مراقبة النظام مستحيلة.

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



مكتبة log القياسية: الإمكانيات الأساسية والقيود

حزمة log من المكتبة القياسية لـ Go هي أبسط طريقة لبدء التسجيل. توفر مسجلاً (logger) جاهزاً يكتب إلى os.Stderr.



مثال بسيط على الاستخدام

package main

import ( "log")

func main() { log.Println("تم تشغيل التطبيق") log.Printf("المستخدم %s قام بتسجيل الدخول", "admin") log.Fatal("خطأ حرج: قاعدة البيانات غير متاحة")}

سيبدو الإخراج كالتالي:

2023/10/27 14:35:12 تم تشغيل التطبيق2023/10/27 14:35:12 المستخدم admin قام بتسجيل الدخول2023/10/27 14:35:12 خطأ حرج: قاعدة البيانات غير متاحة


قيود المسجل القياسي

  • غياب مستويات التسجيل — لا يوجد تقسيم إلى Info, Warn, Error. جميع الرسائل تُكتب في تيار واحد.
  • هيكل ضعيف — السجل عبارة عن سلسلة نصية بسيطة يصعب تحليلها آلياً.
  • غياب السياق — لا يمكن إضافة معرف الطلب أو المستخدم بسهولة.
  • مشاكل في الأداء — المسجل القياسي يمنع goroutine عند الكتابة، مما قد يصبح عنق زجاجة.

بالنسبة للأدوات المساعدة الصغيرة أو النماذج الأولية، فإن log مناسب تماماً. لكن لتطبيقات الإنتاج، يجدر النظر في البدائل.



التسجيل المهيكل (Structured Logging): لماذا هو مهم؟

التسجيل المهيكل هو نهج حيث تمثل كل رسالة مجموعة من أزواج "مفتاح-قيمة" (عادةً بصيغة JSON). هذا يسمح بـ:

  • تحليل السجلات آلياً في أنظمة التجميع (ELK, Splunk, Grafana Loki).
  • تصفية السجلات حسب أي سمات (المستوى، الخدمة، معرف الطلب).
  • بناء لوحات المعلومات والتنبيهات بناءً على الحقول الرقمية.


المكتبات الشائعة للتسجيل المهيكل

  • logrus — واحدة من أولى وأشهر المكتبات. توفر مستويات، تنسيق (JSON, نص)، خطافات (hooks) لإرسال السجلات إلى أنظمة خارجية. لكنها تستهلك ذاكرة عالية.
  • zerolog — مكتبة تركز على الأداء (zero allocation). مناسبة تماماً للخدمات المصغرة والأنظمة عالية التحميل.
  • zap — من Uber. سريع جداً، مع وضعين: SugaredLogger (مريح) و Logger (سرعة قصوى).
  • slog — حزمة قياسية، تمت إضافتها في Go 1.21. توفر تسجيلاً مهيكلاً "مباشراً من الصندوق".


مثال باستخدام slog (Go 1.21+)

package main

import ( "log/slog" "os")

func main() { logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) logger.Info("تم تشغيل الخادم", "port", 8080, "env", "production") logger.Error("خطأ في الاتصال بقاعدة البيانات", "db", "postgres", "timeout", 5)}

الإخراج بصيغة JSON:

{"time":"2023-10-27T14:40:00.123Z","level":"INFO","msg":"تم تشغيل الخادم","port":8080,"env":"production"}{"time":"2023-10-27T14:40:01.456Z","level":"ERROR","msg":"خطأ في الاتصال بقاعدة البيانات","db":"postgres","timeout":5}

المدونات

توصيات الكتب