مقدمة في التسجيل (Logging) في Go: Zap و Logrus
\n\nالتسجيل هو مكون بالغ الأهمية لأي تطبيق جاد. فهو يسمح بتتبع حالة البرنامج، وتسجيل الأخطاء، وتحليل الأداء، وتصحيح الكود في بيئة الإنتاج. في المكتبة القياسية للغة Go توجد حزمة log، لكنها تمتلك إمكانيات محدودة: لا توجد مستويات للتسجيل (باستثناء البدائية)، ولا يوجد إخراج منظم، ولا توجد تنسيقات مرنة. لحل هذه المشكلات، تم إنشاء مكتبتين قويتين: Zap (من Uber) و Logrus (أحد أشهر أدوات التسجيل الأولى).
في هذه المقالة، سنشرح بالتفصيل كلتا المكتبتين، وطرقهما، وأمثلة الاستخدام، وأفضل الممارسات. ستتعلم كيفية إعداد التسجيل المنظم، وكيفية العمل مع المستويات، وكيفية إضافة الحقول السياقية، وكيفية تجنب الأخطاء النموذجية.
\n\nما هو Zap؟
\nZap هي مكتبة عالية الأداء للتسجيل المنظم من شركة Uber. وهي موجهة نحو السرعة وتقليل استخدام الذاكرة إلى أدنى حد. يدعم Zap وضعين للعمل: SugaredLogger (مريح ولكنه أبطأ قليلاً) و Logger (أقصى أداء).
\n\nما هو Logrus؟
\nLogrus هي واحدة من أولى وأشهر مكتبات التسجيل في Go. توفر واجهة برمجة تطبيقات بسيطة، ودعمًا للمستويات، ومنسقين (JSON، Text)، وخطافات (hooks) للتكامل مع الأنظمة الخارجية (مثل Sentry، Slack). Logrus أسهل في التعلم، لكنه أقل أداءً من Zap.
\n\nالتثبيت
\nيتم تثبيت كلتا المكتبتين بالطريقة القياسية عبر go get:
// تثبيت Zap\ngo get -u go.uber.org/zap\n\n// تثبيت Logrus\ngo get -u github.com/sirupsen/logrus\n\n\nبعد التثبيت، يمكنك استيرادهما في مشروعك:
\n\nimport (\n "go.uber.org/zap"\n "github.com/sirupsen/logrus"\n)\n\n\nبداية سريعة مع مثال كود
\n\nمثال مع Zap
\npackage main\n\nimport (\n "go.uber.org/zap"\n)\n\nfunc main() {\n // إنشاء مسجل للإنتاج (أداء عالٍ)\n logger, _ := zap.NewProduction()\n defer logger.Sync() // تفريغ المخزن المؤقت قبل الخروج\n\n // تسجيل رسالة مع حقول\n logger.Info("تم تشغيل التطبيق",\n zap.String("version", "1.0.0"),\n zap.Int("port", 8080),\n )\n\n // استخدام SugaredLogger للراحة\n sugar := logger.Sugar()\n sugar.Infow("قام المستخدم بتسجيل الدخول",\n "user", "john_doe",\n "ip", "192.168.1.1",\n )\n}\n\n\nمثال مع Logrus
\npackage main\n\nimport (\n "github.com/sirupsen/logrus"\n)\n\nfunc main() {\n // ضبط تنسيق الإخراج (JSON)\n logrus.SetFormatter(&logrus.JSONFormatter{})\n\n // تعيين مستوى التسجيل\n logrus.SetLevel(logrus.InfoLevel)\n\n // تسجيل رسالة مع حقول\n logrus.WithFields(logrus.Fields{\n "version": "1.0.0",\n "port": 8080,\n }).Info("تم تشغيل التطبيق")\n\n // تسجيل خطأ\n logrus.WithFields(logrus.Fields{\n "user": "john_doe",\n "ip": "192.168.1.1",\n }).Warn("محاولة دخول بكلمة مرور خاطئة")\n}\n\n\nالطرق والوظائف الأساسية
\n\n1. Zap: NewProduction() / NewDevelopment()
\nما تفعله: تنشئ مسجلاً مكونًا مسبقًا لبيئة الإنتاج أو التطوير. يستخدم مسجل الإنتاج تنسيق JSON وهو محسّن للسرعة. يستخدم مسجل التطوير إخراجًا نصيًا ملونًا ويتضمن تتبعات المكدس (stack traces).
\nالمعلمات: لا توجد (ترجع *zap.Logger وخطأ).
مثال:
\nprodLogger, _ := zap.NewProduction()\ndevLogger, _ := zap.NewDevelopment()\n\n\n