ก่อนหน้านี้ Go 1.21 ออกมานั้น มี Structured log package (log/slog) ออกมาให้ใช้งาน
ซึ่งเคยอธิบายการใช้งานเบื้องต้นไว้ที่นี่
แต่ว่าต้องไปแบ่งปันเรื่อง logging สำหรับระบบที่พัฒนาด้วย Go
จึงทำการอธิบายแบบละเอียดขึ้นไว้หน่อย
มาเริ่มกันเลย
เริ่มจากปัญหาและข้อจำกัดของ log package กันก่อน
- ปัญหาของ log level ใน go นั้นทำการจัดการเหมือนกันเลย ทำให้ยากต่อการแบ่ง หรือ กรองเอาบาง level
- ไม่สนับสนุน context ทำให้ยากต่อการเพิ่มข้อมูลต่าง ๆ ลงไปใน log
- ไม่สามารถจัดการเรื่อง log sampling ได้ นั่นคือจะเก็บ log ทุกอย่าง
- สามารถ configuration ได้น้อย ทำให้ใช้งานจริง ๆ ไม่ได้
- ไม่สนับสนุน structured log message ใช้ได้แค่ plain text เท่านั้น ต้องไปใช้ 3-party package นั่นเอง
ปัญหาต่าง ๆ ทำให้ log package ที่เป็น 3-party package ออกมามากมาย เช่น
- logrus
- zap
ดังนั้นใน Go 1.21 ได้เพิ่ม log/slog package เข้ามา
ซึ่งเขียนโครงสร้างของ package ออกมาคร่าว ๆ ได้ประมาณนี้
สิ่งที่จะเห็นได้ชัดคือ ใน Logger นั้นจะมี function ต่าง ๆ ให้ใช้งานตาม log level
รวมทั้งการส่งค่าต่าง ๆ เข้าไปได้ เช่น handler เป็นต้น
อีกอย่าง แต่ละ log level จะไม่มีการเรียกใช้งาน panic() หรือ exit() เหมือนกับ log package
การใช้งานแบบง่าย ๆ
[gist id="a9822fb8da96d927354a1532230ff1ca" file="1.go"]ทำการเพิ่ม JSONHandler เข้ามาใน Logger
[gist id="a9822fb8da96d927354a1532230ff1ca" file="2.go"]เราสามารถทำการ custom handler ผ่าน HandlerOptions ได้
สามารถกำหนดค่าต่าง ๆ ได้ เช่น log level และ attribute replace เป็นต้น
ใน log message นั้น สามารถเพิ่ม attribute และ nested key เข้าไปได้
ใช้งานผ่าน struct Attr ซึ่งมี type ต่าง ๆ ให้เลือกใช้งานมากมาย
หรือทำเป็น group ก็ได้
ทำการ custom log level ผ่าน interface Leveler
[gist id="a9822fb8da96d927354a1532230ff1ca" file="4.go"]แน่นอนในส่วนของ Handler ก็ custom ได้ ผ่าน interface Handler
โดย default จะมีเพียง 2 handler คือ Text และ JSON เท่านั้น
ดังนั้นในการใช้งานอาจจะต้อง custom อีกแน่นอน
ใน log message อาจจะมี sensitive data ดังนั้นใน slog ก็สามารถซ่อนได้
จะทำการซ่อนไม่ให้แสดงใน log ผ่าน interface LogValuer
ยกตัวอย่าง จะแสดงเพียง id ของ User เท่านั้น
ใช้งาน slog ร่วมกับ web framework ต่าง ๆ ได้
มีคนทำ middleware ให้ลองนำไปใช้งานกันด้วย
เช่น slog: Echo middleware
หรือจะเป็น 3-party log package ต่าง ๆ ก็ใช้งาน slog เป็น backend ของตนเอง
ทำให้สามารถทำงานได้เป็นปกติ เช่น
ดูรายละเอียดเพิ่มเติมได้ที slog package
ขอให้สนุกกับการ coding ครับ
Reference Websites