0Pricing
Go Academy · บทเรียน

ตัวจัดการแบบกำหนดเอง

สร้างผลลัพธ์บันทึกของคุณเอง

ตัวจัดการแบบกำหนดเอง เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

เมื่อตัวจัดการที่มีมาให้ไม่เพียงพอ

ตัวจัดการแบบข้อความและ JSON ครอบคลุมความต้องการส่วนใหญ่ แต่บางครั้งคุณอาจต้องการเอาต์พุตแบบกำหนดเอง เช่น เทอร์มินัลที่มีสี การส่งไปยังระบบเมตริก หรือการปกปิดข้อมูลลับ ในกรณีนี้คุณจะสร้าง ตัวจัดการแบบกำหนดเอง

อินเทอร์เฟซของ Handler

ตัวจัดการต้องนำเมธอดสี่รายการไปใช้งาน:

  • Enabled(ctx, level) bool
  • Handle(ctx, record) error
  • WithAttrs(attrs) Handler
  • WithGroup(name) Handler
type Handler interface {
    Enabled(context.Context, slog.Level) bool
    Handle(context.Context, slog.Record) error
    WithAttrs(attrs []slog.Attr) slog.Handler
    WithGroup(name string) slog.Handler
}

การเปิดใช้งานควบคุมการกรอง

Enabled จะถูกเรียกก่อนสร้างระเบียน การส่งคืนค่า false ทำให้ slog ข้ามการทำงานทั้งหมดได้ จึงควรใช้สำหรับตรวจสอบระดับ

func (h *MyHandler) Enabled(_ context.Context, l slog.Level) bool {
    return l >= slog.LevelInfo
}

Handle เป็นผู้ดำเนินการ

Handle รับ slog.Record ซึ่งมีเวลา ระดับ ข้อความ และแอตทริบิวต์ คุณจะจัดรูปแบบและเขียนข้อมูลตามวิธีที่ต้องการ

func (h *MyHandler) Handle(_ context.Context, r slog.Record) error {
    fmt.Printf("[%s] %s\n", r.Level, r.Message)
    return nil
}

การวนดูแอตทริบิวต์

ระเบียนจะแสดงแอตทริบิวต์ผ่าน r.Attrs ซึ่งเรียกฟังก์ชันของคุณสำหรับแอตทริบิวต์แต่ละรายการ

r.Attrs(func(a slog.Attr) bool {
    fmt.Printf("  %s=%v\n", a.Key, a.Value)
    return true // keep going
})

WithAttrs และ WithGroup

เมธอดเหล่านี้ส่งคืนสำเนาของตัวจัดการที่มีแอตทริบิวต์กำหนดไว้ล่วงหน้า หรือมีคำนำหน้ากลุ่ม ทั้งสองรองรับ logger.With และ slog.Group ตัวจัดการแบบเรียบง่ายอาจจัดเก็บและนำค่าเหล่านี้กลับมาใช้ หรือเพื่อการเรียนรู้ อาจส่งคืนตัวมันเอง

การห่อแทนการสร้างใหม่

บ่อยครั้งคุณไม่จำเป็นต้องสร้างตัวจัดการทั้งหมดขึ้นใหม่ แค่ห่อตัวจัดการที่มีอยู่แล้วและแก้เฉพาะพฤติกรรมที่ต้องการ เช่น เพิ่มแอตทริบิวต์คงที่หรือปกปิดคีย์

type RedactHandler struct{ slog.Handler }

func (h RedactHandler) Handle(ctx context.Context, r slog.Record) error {
    // mutate r here, then delegate
    return h.Handler.Handle(ctx, r)
}

กรณีใช้งาน: การปกปิดข้อมูล

ตัวจัดการที่ปกปิดข้อมูลสามารถสแกนแอตทริบิวต์เพื่อหาคีย์ที่มีข้อมูลละเอียดอ่อน เช่น password หรือ token แล้วแทนค่าก่อนส่งต่อให้ตัวจัดการ JSON

กรณีใช้งาน: การกำหนดเส้นทาง

ตัวจัดการแบบกำหนดเองสามารถกำหนดเส้นทางตามระดับได้: ส่งบันทึก Error ไปยัง stderr และเว็บฮุกแจ้งเตือน ขณะที่ Info ไปยัง stdout วิธีนี้ทำให้ตรรกะการกำหนดเส้นทางไม่ต้องกระจายอยู่ในทุกจุดเรียกใช้

ข้อควรทราบด้านประสิทธิภาพ

Handle อาจทำงานบนเส้นทางที่ถูกเรียกใช้บ่อย หลีกเลี่ยงการจัดสรรหน่วยความจำ ตรวจสอบระดับใน Enabled และนำบัฟเฟอร์กลับมาใช้ใหม่ ตัวจัดการมาตรฐานใช้บัฟเฟอร์จากพูลภายในด้วยเหตุผลนี้

เรียกใช้ได้: ตัวจัดการแบบกำหนดเองอย่างง่าย

โปรแกรมที่ทำงานได้ในตัวนี้กำหนดตัวจัดการขนาดเล็กที่พิมพ์ระดับ ข้อความ และแอตทริบิวต์ จากนั้นบันทึกข้อมูลผ่านตัวจัดการดังกล่าว

package main

import (
    "context"
    "fmt"
    "log/slog"
)

type Mini struct{}

func (Mini) Enabled(context.Context, slog.Level) bool { return true }
func (Mini) WithAttrs(a []slog.Attr) slog.Handler   { return Mini{} }
func (Mini) WithGroup(string) slog.Handler          { return Mini{} }
func (Mini) Handle(_ context.Context, r slog.Record) error {
    fmt.Printf("%s: %s", r.Level, r.Message)
    r.Attrs(func(a slog.Attr) bool {
        fmt.Printf(" %s=%v", a.Key, a.Value)
        return true
    })
    fmt.Println()
    return nil
}

func main() {
    l := slog.New(Mini{})
    l.Info("hello", "user", "ada", "id", 7)
}

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับตัวจัดการแบบกำหนดเอง

สรุป

คุณได้เรียนรู้การสร้างตัวจัดการแบบกำหนดเอง:

  • นำ Enabled, Handle, WithAttrs, WithGroup ไปใช้งาน
  • ตรวจสอบระดับใน Enabled เพื่อประสิทธิภาพ
  • วนดูแอตทริบิวต์ด้วย r.Attrs
  • บ่อยครั้งการห่อตัวจัดการที่มีอยู่แล้วทำได้ง่ายกว่าการสร้างใหม่ตั้งแต่ต้น

คำถามที่พบบ่อย

บทเรียน “ตัวจัดการแบบกำหนดเอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวจัดการแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวจัดการแบบกำหนดเอง”

สร้างผลลัพธ์บันทึกของคุณเอง คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวจัดการแบบกำหนดเอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เหตุผลที่ใช้บันทึกแบบมีโครงสร้าง
  2. ตัวจัดการ slog
  3. ระดับและแอตทริบิวต์ของบันทึก
  4. ตัวจัดการแบบกำหนดเอง
← กลับไปที่ Go Academy