บันทึกข้อมูล (Logger)

Middleware สำหรับ Fiber ซึ่งใช้สำหรับบันทึกข้อมูลเกี่ยวกับ HTTP requests และ responses อย่างละเอียด

อินเตอร์เฟซ

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

ตัวอย่าง

นำเข้า middleware package ของ Fiber web framework:

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

หมายเหตุ: การลงทะเบียนเรียกเป็นลำดับเป็นสิ่งสำคัญ รูทที่ลงทะเบียนหลังจาก middleware นี้จะถูกบันทึกเท่านั้น ดังนั้น middleware นี้ควรเป็นหนึ่งในรายการแรกที่จะลงทะเบียน

หลังจากที่ Fiber application ถูกกำหนดค่าเรียบร้อยแล้ว สามารถที่จะลงทะเบียน middleware ได้ตามวิธีต่อไปนี้:

// กำหนดค่าเริ่มต้น
app.Use(logger.New())

// หรือกำหนดค่าอื่นๆ
// บันทึก IP และพอร์ตที่เชื่อมต่อ
app.Use(logger.New(logger.Config{
    Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
}))

// บันทึก request ID
app.Use(requestid.New())
app.Use(logger.New(logger.Config{
    // สำหรับตัวเลือกเพิ่มเติม ดูได้ที่ส่วนของ 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("error opening file: %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("นี่คือแท็กกำหนดเอง")
        },
    },
}))

// ฟังก์ชัน callback หลังจากบันทึกเสร็จ
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,
}))

การกำหนดค่า

Property Type คำอธิบาย ค่าเริ่มต้น
Next func(*fiber.Ctx) bool กำหนดฟังก์ชันที่ข้าม middleware เมื่อมันส่งคืนค่า true nil
Done func(*fiber.Ctx, []byte) ฟังก์ชันที่เรียกหลังจากเขียนสตริงบันทึกของคำขอลงใน Output พร้อมกับสตริงบันทึกที่ถูกส่งเป็นพารามิเตอร์ nil
CustomTags map[string]LogFunc กำหนดการดำเนินการแท็กที่กำหนดเอง map[string]LogFunc
Format string กำหนดแท็กบันทึก [${time}] ${status} - ${latency} ${method} ${path}\n
TimeFormat string กำหนดรูปแบบเวลาของแท็กการบันทึกเวลา 15:04:05
TimeZone string สามารถกำหนดเวลาโซนเฮาต์ "Local"
TimeInterval time.Duration เวลารอก่อนที่จะอัพเดต timestamp 500 * time.Millisecond
Output io.Writer Output เป็น 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,
}

ค่าคงที่

// ตัวแปรของ Logger
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"                	// เครื่องผู้ใช้ (User Agent)
    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"             	// รีเซ็ตสี
)