Middleware التسجيل ومعرّف الطلب
التسجيل المنظم وحقن معرّف التتبّع
Middleware التسجيل ومعرّف الطلب درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
لماذا التسجيل المنظّم؟
يصعب تحليل سجلات النص العادي على نطاق واسع. يتيح التسجيل المنظّم (بصيغة JSON أو key=value) لمجمّعات السجلات (Datadog وLoki وELK) تصفية الإدخالات وربطها حسب الحقل.
إنشاء معرّف الطلب
أنشئ معرّفًا فريدًا لكل طلب (UUID أو ULID) في البرمجية الوسيطة، وأرفقه بترويسة الاستجابة والسياق:
func RequestID(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := r.Header.Get("X-Request-ID")
if id == "" { id = uuid.New().String() }
w.Header().Set("X-Request-ID", id)
ctx := context.WithValue(r.Context(), reqIDKey{}, id)
next.ServeHTTP(w, r.WithContext(ctx))
})
}برمجية وسيطة للتسجيل باستخدام slog
أضاف Go 1.21 الحزمة log/slog للتسجيل المنظّم. استخدمها داخل البرمجية الوسيطة:
func StructuredLogger(logger *slog.Logger) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
cw := &captureWriter{ResponseWriter: w}
next.ServeHTTP(cw, r)
logger.Info("request",
"method", r.Method,
"path", r.URL.Path,
"status", cw.status,
"latency_ms", time.Since(start).Milliseconds(),
"request_id", r.Context().Value(reqIDKey{}),
)
})
}
}captureWriter
غلّف ResponseWriter لالتقاط رمز الحالة الذي يكتبه المعالج:
type captureWriter struct {
http.ResponseWriter
status int
}
func (cw *captureWriter) WriteHeader(code int) {
cw.status = code
cw.ResponseWriter.WriteHeader(code)
}
func (cw *captureWriter) Status() int {
if cw.status == 0 { return http.StatusOK }
return cw.status
}إضافة معرّف الطلب إلى كل سطر سجل
أنشئ مسجّلًا فرعيًا لكل طلب مع تعبئة المعرّف مسبقًا، ثم خزّنه في السياق:
reqLogger := logger.With("request_id", id)
ctx := context.WithValue(r.Context(), loggerKey{}, reqLogger)استرجاع المسجّل من السياق
مساعد للحصول على المسجّل الخاص بالطلب من أي معالج أو خدمة:
func LoggerFromContext(ctx context.Context) *slog.Logger {
l, ok := ctx.Value(loggerKey{}).(*slog.Logger)
if !ok { return slog.Default() }
return l
}مستويات السجل
استخدم المستويات المناسبة: Debug للإسهاب أثناء التطوير، وInfo لملخصات الطلبات، وWarn للحالات الشاذة القابلة للاسترداد، وError للإخفاقات التي تتطلب إجراءً. لا تسجّل الحقول الحساسة (الرموز وكلمات المرور).
فئات زمن الاستجابة
أدرج زمن استجابة الطلب في كل سطر سجل. واجمع القيم في فئات مدرج تكراري ضمن نظام المقاييس لديك (Prometheus) لتتبّع المئينات P50 وP95 وP99.
معرّفات الارتباط في الخدمات المصغّرة
مرّر ترويسة X-Request-ID من الطلبات الواردة إلى جميع استدعاءات HTTP وgRPC الصادرة، لتمكين التتبّع الموزّع من دون نظام تتبّع متكامل.
أخذ عينات من السجلات
بالنسبة إلى الخدمات ذات حركة المرور المرتفعة، خذ عينات من سجلات debug/info (مثلًا، سجّل طلبًا واحدًا من كل 100 طلب بمستوى debug) لتقليل تكاليف التخزين مع الاحتفاظ بسجلات الأخطاء كاملة.
مقارنة zap وslog
تكون zap (من Uber) أسرع من slog في الخدمات ذات معدل النقل المرتفع، لكنها تتطلب إعدادًا أكبر. أما slog فهي جزء من المكتبة القياسية، وقابلة للنقل، وكافية لمعظم الخدمات. فضّل slog ما لم تُظهر الاختبارات المعيارية وجود عنق زجاجة.
تحقق سريع
لماذا نحتاج إلى captureWriter في البرمجية الوسيطة للتسجيل؟
مراجعة: التسجيل ومعرّف الطلب
النقاط الرئيسية:
- أنشئ أو مرّر X-Request-ID في البرمجية الوسيطة، وخزّنه في context
- استخدم slog للسجلات المهيكلة التي تحتوي على حقول مفتاح-قيمة
- يعترض captureWriter رمز الحالة من أجل التسجيل بعد تنفيذ المعالج
- مرّر معرّف الارتباط إلى جميع الاستدعاءات اللاحقة
تعلم Go مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «Middleware التسجيل ومعرّف الطلب» مجاني؟
نعم — نص درس «Middleware التسجيل ومعرّف الطلب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «Middleware التسجيل ومعرّف الطلب»؟
التسجيل المنظم وحقن معرّف التتبّع تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «Middleware التسجيل ومعرّف الطلب»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات سلسلة Middleware لـ HTTP
- Middleware التسجيل ومعرّف الطلب
- Middleware المصادقة وتحديد معدل الطلبات
- Middleware لـ CORS واستعادة ما بعد panic