ก่อนหน้านี้ 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 ออกมามากมาย เช่น
ดังนั้นใน 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 ก็ได้
[gist id="a9822fb8da96d927354a1532230ff1ca" file="3.go"]
ทำการ custom log level ผ่าน interface Leveler
[gist id="a9822fb8da96d927354a1532230ff1ca" file="4.go"]
แน่นอนในส่วนของ Handler ก็ custom ได้ ผ่าน interface Handler
โดย default จะมีเพียง 2 handler คือ Text และ JSON เท่านั้น ดังนั้นในการใช้งานอาจจะต้อง custom อีกแน่นอน
[gist id="a9822fb8da96d927354a1532230ff1ca" file="5.go"]
ใน log message อาจจะมี sensitive data ดังนั้นใน slog ก็สามารถซ่อนได้
จะทำการซ่อนไม่ให้แสดงใน log ผ่าน interface LogValuer ยกตัวอย่าง จะแสดงเพียง id ของ User เท่านั้น
[gist id="a9822fb8da96d927354a1532230ff1ca" file="6.go"]
ใช้งาน slog ร่วมกับ web framework ต่าง ๆ ได้
มีคนทำ middleware ให้ลองนำไปใช้งานกันด้วย เช่น slog: Echo middleware
หรือจะเป็น 3-party log package ต่าง ๆ ก็ใช้งาน slog เป็น backend ของตนเอง ทำให้สามารถทำงานได้เป็นปกติ เช่น
ดูรายละเอียดเพิ่มเติมได้ที slog package
ขอให้สนุกกับการ coding ครับ
Reference Websites