سجل (Logger)

واجهة برمجية لـ Fiber تستخدم لتسجيل معلومات مفصلة حول طلبات HTTP والردود.

واجهة البرمجة

func New(config ...Config) fiber.Handler

مثال

استورد حزمة الوسيط من إطار العمل Fiber:

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/logger"
)

ملاحظة: ترتيب التسجيل أمر حاسم. ستتم تسجيل الطرق فقط بعد تسجيل هذا الوسيط. لذلك يجب أن يكون هذا الوسيط واحدًا من أوائل الواسطات المسجلة.

بعد تهيئة تطبيق Fiber، يمكنك تسجيل الوسيط بالطرق التالية:

// تهيئة مع التكوين الافتراضي
app.Use(logger.New())

// أو تخصيص التكوين
// سجّل عنوان IP والمنفذ البعيد
app.Use(logger.New(logger.Config{
    Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
}))

// سجّل مُعرف الطلب
app.Use(requestid.New())
app.Use(logger.New(logger.Config{
    // لمزيد من الخيارات، انظر القسم التكوين
    Format: "${pid} ${locals:requestid} ${status} - ${method} ${path}\n",
}))

// غير منطقة التوقيت وتنسيق الوقت
app.Use(logger.New(logger.Config{
    Format:     "${pid} ${status} - ${method} ${path}\n",
    TimeFormat: "02-Jan-2006",
    TimeZone:   "America/New_York",
}))

// كاتب الملف المُخصص
file, err := os.OpenFile("./123.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
    log.Fatalf("خطأ في فتح الملف: %v", err)
}
defer file.Close()
app.Use(logger.New(logger.Config{
    Output: file,
}))

// إضافة وسم مخصص
app.Use(logger.New(logger.Config{
    CustomTags: map[string]logger.LogFunc{
        "custom_tag": func(output logger.Buffer, c *fiber.Ctx, data *logger.Data, extraParam string) (int, error) {
            return output.WriteString("هذا وسم مخصص")
        },
    },
}))

// دالة انتهاء بعد التسجيل
app.Use(logger.New(logger.Config{
    TimeFormat: time.RFC3339Nano,
    TimeZone:   "Asia/Shanghai",
    Done: func(c *fiber.Ctx, logString []byte) {
        if c.Response().StatusCode() != fiber.StatusOK {
            reporter.SendToSlack(logString) 
        }
    },
}))

// تعطيل الألوان عند الإخراج بتنسيق الافتراضي
app.Use(logger.New(logger.Config{
    DisableColors: true,
}))

التكوين

الخاصية النوع الوصف القيمة الافتراضية
Next func(*fiber.Ctx) bool تحديد الدالة التي تتخطى الوسيط عندما تعيد القيمة true. nil
Done func(*fiber.Ctx, []byte) دالة تُستدعى بعد كتابة سلسلة تسجيل الطلب إلى الإخراج، حيث يتم تمرير سلسلة التسجيل كمعلمة. nil
CustomTags map[string]LogFunc تعريف وظائف الوسم للعمليات المخصصة. map[string]LogFunc
Format string تعريف الوسوم في سلسلة التسجيل. [${time}] ${status} - ${latency} ${method} ${path}\n
TimeFormat string تحديد تنسيق الوقت للطابع الزمني في سجل التسجيل. 15:04:05
TimeZone string يمكن تحديد نطاق التوقيت كـ "UTC"، "America/New_York"، "Asia/Chongqing"، إلخ. "Local"
TimeInterval time.Duration تحدد فاصل الزمن قبل تحديث الطابع الزمني. 500 * time.Millisecond
Output io.Writer الإخراج هو كاتب يُستخدَم لكتابة التسجيل. os.Stdout
DisableColors bool يحدد ما إذا كان إخراج التسجيل يجب أن يكون ملوّنًا. false
enableColors bool الحقل الداخلي لتمكين الألوان في إخراج التسجيل. (هذا ليس حقلًا قابلًا للتكوين) -
enableLatency bool الحقل الداخلي لتمكين قياس الكمدي في التسجيل. (هذا ليس حقلًا قابلًا للتكوين) -
timeZoneLocation *time.Location الحقل الداخلي لموقع منطقة التوقيت. (هذا ليس حقلًا قابلًا للتكوين) -

التكوين الافتراضي

var ConfigDefault = Config{
    Next:          nil,
    Done:          nil,
    Format:        "[${time}] ${status} - ${latency} ${method} ${path}\n",
    TimeFormat:    "15:04:05",
    TimeZone:      "Local",
    TimeInterval:  500 * time.Millisecond,
    Output:        os.Stdout,
    DisableColors: false,
}

الثوابت

// متغيرات سجل
const (
    TagPid               = "pid"               	// معرف العملية
    TagTime              = "time"              	// الوقت
    TagReferer           = "referer"           	// المُحَوِّر
    TagProtocol          = "protocol"          	// البروتوكول
    TagPort              = "port"              	// المنفذ
    TagIP                = "ip"                	// عنوان IP
    TagIPs               = "ips"               	// عناوين IP
    TagHost              = "host"              	// المضيف
    TagMethod            = "method"            	// طريقة الطلب
    TagPath              = "path"              	// المسار
    TagURL               = "url"               	// عنوان URL
    TagUA                = "ua"                	// وكيل المستخدم
    TagLatency           = "latency"           	// التأخير
    TagStatus            = "status"            	// حالة الاستجابة
    TagResBody           = "resBody"           	// جسم الاستجابة
    TagReqHeaders        = "reqHeaders"        	// رؤوس الطلب
    TagQueryStringParams = "queryParams"       	// معاملات الاستعلام
    TagBody              = "body"              	// جسم الطلب
    TagBytesSent         = "bytesSent"         	// البيانات المُرسَلة
    TagBytesReceived     = "bytesReceived"     	// البيانات المُستَقَبَلَة
    TagRoute             = "route"             	// المسار
    TagError             = "error"             	// خطأ
    // مهمل: استخدم "TagReqHeader" بدلاً من ذلك
    TagHeader            = "header:"           	// رأس الطلب
    TagReqHeader         = "reqHeader:"        	// رأس الطلب
    TagRespHeader        = "respHeader:"       	// رأس الاستجابة
    TagQuery             = "query:"            	// استعلام
    TagForm              = "form:"             	// نموذج
    TagCookie            = "cookie:"           	// ملف تعريف الارتباط
    TagLocals            = "locals:"           	// المتغيرات المحلية
    // الألوان
    TagBlack             = "black"             	// أسود
    TagRed               = "red"               	// أحمر
    TagGreen             = "green"             	// أخضر
    TagYellow            = "yellow"            	// أصفر
    TagBlue              = "blue"              	// أزرق
    TagMagenta           = "magenta"           	// أرجواني
    TagCyan              = "cyan"              	// سماوي
    TagWhite             = "white"             	// أبيض
    TagReset             = "reset"             	// إعادة تعيين اللون
)