Zap / Logrus للغة Go: دليل شامل مع أمثلة

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

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

ابدأ الدورة

مقدمة في التسجيل (Logging) في Go: Zap و Logrus

\n\n

التسجيل هو مكون بالغ الأهمية لأي تطبيق جاد. فهو يسمح بتتبع حالة البرنامج، وتسجيل الأخطاء، وتحليل الأداء، وتصحيح الكود في بيئة الإنتاج. في المكتبة القياسية للغة Go توجد حزمة log، لكنها تمتلك إمكانيات محدودة: لا توجد مستويات للتسجيل (باستثناء البدائية)، ولا يوجد إخراج منظم، ولا توجد تنسيقات مرنة. لحل هذه المشكلات، تم إنشاء مكتبتين قويتين: Zap (من Uber) و Logrus (أحد أشهر أدوات التسجيل الأولى).

\n\n

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

\n\n

ما هو Zap؟

\n

Zap هي مكتبة عالية الأداء للتسجيل المنظم من شركة Uber. وهي موجهة نحو السرعة وتقليل استخدام الذاكرة إلى أدنى حد. يدعم Zap وضعين للعمل: SugaredLogger (مريح ولكنه أبطأ قليلاً) و Logger (أقصى أداء).

\n\n

ما هو Logrus؟

\n

Logrus هي واحدة من أولى وأشهر مكتبات التسجيل في Go. توفر واجهة برمجة تطبيقات بسيطة، ودعمًا للمستويات، ومنسقين (JSON، Text)، وخطافات (hooks) للتكامل مع الأنظمة الخارجية (مثل Sentry، Slack). Logrus أسهل في التعلم، لكنه أقل أداءً من Zap.

\n\n

التثبيت

\n

يتم تثبيت كلتا المكتبتين بالطريقة القياسية عبر go get:

\n\n
// تثبيت Zap\ngo get -u go.uber.org/zap\n\n// تثبيت Logrus\ngo get -u github.com/sirupsen/logrus\n
\n\n

بعد التثبيت، يمكنك استيرادهما في مشروعك:

\n\n
import (\n    "go.uber.org/zap"\n    "github.com/sirupsen/logrus"\n)\n
\n\n

بداية سريعة مع مثال كود

\n\n

مثال مع Zap

\n
package 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

\n
package 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\n

1. Zap: NewProduction() / NewDevelopment()

\n

ما تفعله: تنشئ مسجلاً مكونًا مسبقًا لبيئة الإنتاج أو التطوير. يستخدم مسجل الإنتاج تنسيق JSON وهو محسّن للسرعة. يستخدم مسجل التطوير إخراجًا نصيًا ملونًا ويتضمن تتبعات المكدس (stack traces).

\n

المعلمات: لا توجد (ترجع *zap.Logger وخطأ).

\n

مثال:

\n
prodLogger, _ := zap.NewProduction()\ndevLogger, _ := zap.NewDevelopment()\n
\n\n

2. Zap: Logger.Info(),

توصيات