zerolog في Go: الدليل الشامل للتسجيل بدون تخصيص ذاكرة
في عالم تطبيقات Go ذات الأحمال العالية، الأداء هو الأولوية القصوى. أي تخصيص إضافي للذاكرة قد يزيد من وقت عمل جامع القمامة (GC) ويقلل من إنتاجية الخدمة. مكتبات التسجيل التقليدية مثل log من المكتبة القياسية أو logrus الشهيرة، رغم سهولتها، إلا أنها تخلق عبئًا كبيرًا على الكومة (heap) عن طريق تخصيص ذاكرة لكل استدعاء للمسجل. هنا يأتي دور zerolog - مكتبة تسجيل في Go صُممت خصيصًا مع التركيز على عدم تخصيص الذاكرة (zero allocation).
توفر zerolog للمطورين واجهة برمجة تطبيقات قوية ومرنة وسريعة بشكل لا يصدق للتسجيل المنظم بتنسيق JSON. على عكس العديد من البدائل، تستخدم zerolog سلسلة من استدعاءات الدوال (fluent API) وتتجنب الواجهات والانعكاس (reflection) في المسارات الحرجة، مما يحقق أداءً يقترب من تنسيق السلاسل اليدوي. هذا يجعلها الخيار الأمثل للخدمات المصغرة، بوابات API، خوادم البروكسي، وأي برنامج تكون فيه كل ميكروثانية وكل بايت من الذاكرة مهمًا.
المكتبة ليست سريعة فحسب، بل مريحة للغاية أيضًا. تدعم مستويات التسجيل (debug, info, warn, error, fatal, panic)، التسجيل السياقي باستخدام Logger.With()، التكامل مع سياق Go (context.Context)، بالإضافة إلى إعدادات مرنة للإخراج (وحدة التحكم أو JSON). في هذه المقالة، سنشرح بالتفصيل كيفية تثبيت zerolog، ونتقن دوالها الأساسية من خلال أمثلة عملية، ونستعرض أفضل الممارسات لتحقيق أقصى أداء.
التثبيت
يتم تثبيت zerolog، مثل معظم مكتبات Go، باستخدام مدير الحزم go get. قم بتنفيذ الأمر التالي في جذر مشروعك (حيث يوجد ملف go.mod):
go get -u github.com/rs/zerolog/log
بعد تنفيذ هذا الأمر، ستتم إضافة المكتبة إلى ملف go.mod الخاص بك، وستتمكن من استيرادها في الكود الخاص بك.
بداية سريعة: مثال عملي بسيط
لنبدأ بأبسط مثال يوضح الاستخدام الأساسي لـ zerolog لإخراج رسالة بتنسيق JSON.
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
// تعيين مستوى التسجيل العام إلى Debug.
// المستوى الافتراضي هو Info.
zerolog.SetGlobalLevel(zerolog.DebugLevel)
// تسجيل سلسلة نصية بسيطة.
log.Print("مرحبًا، zerolog!")
// تسجيل بمستوى Info.
log.Info().Msg("تم تشغيل الخدمة بنجاح")
// تسجيل بمستوى Warn.
log.Warn().Msg("تم اكتشاف طلب بطيء محتمل")
// تسجيل بمستوى Error.
log.Error().Msg("فشل الاتصال بقاعدة البيانات")
}
عند تشغيل هذا الكود، سترى في وحدة التحكم أسطر JSON تحتوي على الوقت والمستوى والرسالة ومعلومات إضافية أخرى. لاحظ سلسلة الاستدعاءات: log.Info().Msg("..."). هذه هي واجهة fluent API التي تجعل الكود موجزًا.
الدوال والطرق الأساسية
توفر zerolog مجموعة غنية من الدوال للتسجيل المرن وعالي الأداء. دعنا نستعرض 8 دوال رئيسية منها.
1. log.Info(), log.Debug(), log.Warn(), log.Error(), log.Fatal(), log.Panic()
التوقيع: func Info() *Event (وبالمثل للمستويات الأخرى)
الوظيفة: تنشئ هذه الدوال حدث تسجيل جديد بالمستوى المناسب. تُرجع مؤشرًا لهيكل Event، والذي يمكنك بعد ذلك إضافة حقول إليه باستخدام دوال أخرى (مثل Str(), Int()).