ตัวจัดการแบบกำหนดเอง
สร้างผลลัพธ์บันทึกของคุณเอง
ตัวจัดการแบบกำหนดเอง เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
เมื่อตัวจัดการที่มีมาให้ไม่เพียงพอ
ตัวจัดการแบบข้อความและ JSON ครอบคลุมความต้องการส่วนใหญ่ แต่บางครั้งคุณอาจต้องการเอาต์พุตแบบกำหนดเอง เช่น เทอร์มินัลที่มีสี การส่งไปยังระบบเมตริก หรือการปกปิดข้อมูลลับ ในกรณีนี้คุณจะสร้าง ตัวจัดการแบบกำหนดเอง
อินเทอร์เฟซของ Handler
ตัวจัดการต้องนำเมธอดสี่รายการไปใช้งาน:
Enabled(ctx, level) boolHandle(ctx, record) errorWithAttrs(attrs) HandlerWithGroup(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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุผลที่ใช้บันทึกแบบมีโครงสร้าง
- ตัวจัดการ slog
- ระดับและแอตทริบิวต์ของบันทึก
- ตัวจัดการแบบกำหนดเอง